В справочном руководстве Bash
Использование
time
как зарезервированное слово позволяет синхронизацию встроенных команд оболочки , функции оболочки и трубопроводам . Внешняяtime
команда не может рассчитать это легко.
Не могли бы вы объяснить, почему цитата говорит это?
Это из-за разницы между зарезервированным словом и командой, а не только в случае
time
? Например, как оболочка bash анализирует или интерпретирует их по-разному?Или это ограничено только случаем
time
?В следующих примерах
почему внешняя сторона
time
работает со встроенной оболочкой и конвейером, а в кавычках говорится, что «они не могут легко их определить»?Внешний
time
на встроенной оболочке :$ /usr/bin/time echo hello hello 0.00user 0.00system 0:00.00elapsed 0%CPU (0avgtext+0avgdata 1676maxresident)k 0inputs+0outputs (0major+78minor)pagefaults 0swaps
Внешний
time
по трубопроводу :$ /usr/bin/time sleep 10 | sleep 5 0.00user 0.00system 0:10.00elapsed 0%CPU (0avgtext+0avgdata 1776maxresident)k 0inputs+0outputs (0major+79minor)pagefaults 0swaps
В следующем примере, почему внешняя
time
по функции оболочки терпят неудачу? Что означает вывод ошибки?$ function mytest () { sleep 10; } $ /usr/bin/time mytest /usr/bin/time: cannot run mytest: No such file or directory Command exited with non-zero status 127 0.00user 0.00system 0:00.03elapsed 0%CPU (0avgtext+0avgdata 1252maxresident)k 32inputs+0outputs (0major+30minor)pagefaults 0swaps
Кажется, что цитата относится не только к встроенным функциям оболочки, функциям оболочки и конвейерам, но и к группе команд :
$ time { echo hello; sleep 3; echo tim; } hello tim real 0m3.002s user 0m0.000s sys 0m0.000s $ /usr/bin/time { echo hello; sleep 3; echo tim; } bash: syntax error near unexpected token `}'
Почему оболочка говорит "bash: синтаксическая ошибка рядом с неожиданным токеном
}
" в случае команды/usr/bin/time
?
источник
Ответы:
In
bash
,time
является зарезервированным словом , поэтому оболочка может проанализировать его по-своему и применить к нему правила.Вот код, показывающий, как
bash
строка разбора начинается сtime
зарезервированного слова :Видите ли,
time
может следовать большинство другихbash
зарезервированных слов.В случае внешней команды применялось нормальное правило,
{
считалось вводом/usr/bin/time
.}
один неверный токен, иbash
поднять ошибку.В:
external
time
вызывал не встроенную оболочку,echo
а внешнююecho
команду.А
strace
проверяет, что:Здесь внешний
time
поиск вашейPATH
переменной, чтобы найти исполняемый файл команды. Это также объясняет, что в случае использования функции у вас нет такого файла или каталога, потому чтоmytest
в вашей команде нет названной командыPATH
.источник
{
считается ввод/usr/bin/time
, а}
один недействительный токен?В 2. вы можете видеть, что вывод неправильный, особенно для второго случая:
/usr/bin/time
умножить на первую команду конвейера (10 с). Затем/usr/bin/time sleep 10
вывод команды передается по конвейеруsleep 5
. Это оболочка, которая ломает вашу командную строку таким образом: для нее,/usr/bin/time
как и любая другая команда.В 3. функции оболочки являются внутренними по отношению к процессу оболочки:
/usr/bin/time
вызывается с аргументомmytest
, ищет эту команду в пути и ничего не находит./usr/bin/time
вызывается оболочкой, но не является ее частью.источник