Нет такого файла или каталога при выполнении / usr / bin / time

10

Я строю свой собственный андроид. Чтобы построить его, мне нужно запустить

mka -j8 bacon

Однако я хотел измерить время, необходимое для его создания, поэтому я использовал

/usr/bin/time -f "User\t%U\nSys\t%S\nReal\t%E\nCPU\t%P" mka -j8 bacon

Это не будет работать, потому что он говорит

/usr/bin/time: cannot run mka: No such file or directory

Любая помощь, как обойти это, оценивается! Я запускаю xubuntu.

Edit:

По какой-то причине использование make вместо mka действительно работает, однако использование mka лучше.

/usr/bin/time -f "User\t%U\nSys\t%S\nReal\t%E\nCPU\t%P" make -j8 bacon

Изменить 2: с веб-сайта cyanogenmod

  

Вызов $ source build/envsetup.sh или $ . build/envsetup.sh из   ваша оболочка запускает скрипт envsetup.sh в каталоге сборки.   envsetup.sh добавляет много функций в среду сборки, большинство   важные из которых перечислены ниже.

source build/evnsetup.sh - это команда, которую я запускаю до выполнения времени. Одной из этих добавленных функций evnsetup.sh является mka , можно ли это вызвать из команды time ?

Изменить 3: Вывод типа mka

$ type mka
mka is a function
mka () 
{ 
    case 'uname -s' in 
        Darwin)
            make -j 'sysctl hw.ncpu|cut -d" " -f2' "[email protected]"
        ;;
        *)
            schedtool -B -n 1 -e ionice -n 1 make -j$(cat /proc/cpuinfo | grep "^processor" | wc -l) "[email protected]"
        ;;
    esac
}
    
задан P1nGu1n 06.03.2014 в 07:18
источник

1 ответ

11

Проблема заключается в том, что mka - это функция bash, экспортированная вашим скриптом, а не исполняемый файл (в отличие от make ), поэтому /usr/bin/time не находит его, поскольку он ищет исполняемый файл.

Существует два возможных решения.

Во-первых, обратите внимание, что существует разница между встроенной функцией bash time и исполняемым /usr/bin/time . Это разные команды, которые принимают разные параметры и генерируют разные выходные данные:

$ time sleep 1

real    0m1.001s
user    0m0.000s
sys     0m0.001s

$ /usr/bin/time sleep 1
0.00user 0.00system 0:01.00elapsed 0%CPU (0avgtext+0avgdata 664maxresident)k
0inputs+0outputs (0major+215minor)pagefaults 0swaps

Введите help time , чтобы получить справку для встроенного bash time . Введите man time , чтобы получить справку для исполняемого файла /usr/bin/time .

Первое решение использует time , тогда как второе решение использует /usr/bin/time .

Первое решение: использование встроенной функции bash time

Встроенная функция bash time знает объявленные функции bash, и вы можете сразу использовать ее для измерения времени таких функций.

$ foo() {
    sleep 1;
    echo "Hello World"
  }
$ time foo
Hello World

real    0m1.002s
user    0m0.000s
sys     0m0.001s

В вашем случае должна работать следующая команда:

$ time mka -j8 bacon

Это был бы мой любимый способ. Тем не менее, он может не генерировать точно то, что вы хотите. В частности, он не измеряет или не печатает использование ЦП.

Второе решение: используя исполняемый файл /usr/bin/time

Вы не можете напрямую измерить время встроенной функции bash, используя /usr/bin/time (насколько я знаю), но то, что вы можете сделать, это измерить время исполняемого файла /bin/bash , выполняющего эту функцию bash. Это немного взломанно, и при создании дополнительного экземпляра bash он генерирует небольшие накладные расходы. Но эти накладные расходы могут быть незначительными, когда сталкиваются с функцией, которая требует минут для вычисления, поэтому она может по-прежнему удовлетворять ваши потребности лучше.

Чтобы запустить исполняемый файл /bin/bash в функции bash, нам нужно сначала экспортировать функцию.

$ foo() {
    sleep 1;
    echo "Hello World"
  }
$ export -f foo
$ echo foo | /usr/bin/time /bin/bash
Hello World
0.00user 0.00system 0:01.00elapsed 0%CPU (0avgtext+0avgdata 1476maxresident)k
0inputs+0outputs (0major+707minor)pagefaults 0swaps

Следовательно, в вашем случае, чтобы иметь возможность использовать /usr/bin/time и генерировать желаемый формат вывода, вы можете действовать следующим образом:

$ export -f mka
$ echo 'mka -j8 bacon' | /usr/bin/time -f "User\t%U\nSys\t%S\nReal\t%E\nCPU\t%P" /bin/bash
    
ответ дан Malte Skoruppa 08.03.2014 в 06:06
источник