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

11

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

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.

Редактировать:

По какой-то причине использование 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` "$@"
        ;;
        *)
            schedtool -B -n 1 -e ionice -n 1 make -j$(cat /proc/cpuinfo | grep "^processor" | wc -l) "$@"
        ;;
    esac
}
P1nGu1n
источник
Вы пытались поставить весь путь mka (что-то вроде / usr / bin / mka)?
Desgua
Проблема в том, что evnsetup.sh инициализирует некоторые вещи. В терминале мне нужно выполнить этот файл, прежде чем я смогу вызвать mka. Видимо, он не распознается при вызове его в качестве параметра из команды времени.
P1nGu1n
Как я могу воспроизвести это?
Брайам
После того, как вы выполнили свой source build/evnsetup.sh, в тот момент, когда вы хотите позвонить time mka -j8 bacon, можете ли вы опубликовать вывод команды type mka?
Malte Skoruppa
Добавлен вывод @MalteSkoruppa, mka - это функция bash?
P1nGu1n

Ответы:

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

Встроенная функция timebash знает о объявленных функциях 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
источник
Спасибо, я действительно понимаю, почему это не работает! Два коротких вопроса, что значит -fпараметр, я так и не смог найти. Во-вторых, что делает / bin / bash? Действительно ценю это!
P1nGu1n
1
-fПараметр exportуказывает exportэкспортировать функцию оболочки. См help export. -fПараметр /usr/bin/timeуказывает /usr/bin/timeожидать формат строки, но я предполагаю , что это вы знаете. /bin/bashЧасть последней команды является Баш исполняемой, выполнение время фактически измеряется, когда он сам выполняет экспортированную mkaфункцию. Он выполняет mkaфункцию, потому что читает и выполняет mka -j8 baconкоманду из стандартного ввода, поэтому мы используем echoи конвейер. Извините за поздний ответ, просто прочитайте это. :)
Malte Skoruppa