Немає такого файлу чи каталогу під час виконання / usr / bin / time


11

Я будую свій власний андроїд-ром. Для того щоб його побудувати, мені потрібно запустити

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: з веб-сайту ціаногенних моделей

Викликання $ 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
}

Ви намагалися прокласти весь шлях mka (щось на кшталт / usr / bin / mka)?
desgua

Проблема полягає в тому, що evnsetup.sh ініціалізує деякі речі. У терміналі я повинен виконати цей файл, перш ніж я зможу викликати mka. Мабуть, він не розпізнається, коли викликає його як параметр із команди time.
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

Дякую, я дійсно розумію, чому це не працювало! Два коротких питання, що робить -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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.