$ cmd='time sleep 2'
$ $cmd
bash: time: command not found
Что тут происходит? Дело не в том, что встроенные оболочки не работают, потому что это работает:
$ cmd2='echo wef'
$ $cmd2
wef
Есть идеи?
Изменить: я нашел разницу:
$ type time
time is a shell keyword
Vs:
$ type echo
echo is a shell builtin
Теперь возникает вопрос: почему встроенная функция работает в строке, а ключевое слово - нет?
linux
bash
shell
shell-script
ACK_stoverflow
источник
источник
which time
? Возможно, вы не установилиtime
команду.time
является частью bash, у меня нетtime
установленного двоичного файла.Ответы:
time
поскольку ключевое слово GNU Bash имеет очень конкретное место, где принимается, см., например, синтаксис для конструкции конвейера команд:Это жестко закодирует позицию ключевого слова вне расширений (поскольку команда N будет там, где раскрываются параметры и переменные). Фактически, семантика применяется ко всему конвейеру, а не к команде, поэтому, вероятно, именно поэтому это должно быть ключевое слово.
Существует встроенная оболочка
times
(в POSIX - специальная встроенная ), для этого расширение работает, поскольку первое слово может быть исполняемым или встроенным в оболочку.В качестве альтернативы GNU coreutils содержит
/bin/time
исполняемый файл.Фактически
time
это не зарезервированное слово в POSIX Shell (хотя bash в любом случае распознает его в режиме posix (если не-
следует по неочевидным причинам)).Внутри
eval
выражения ключевые слова распознаются bash , поэтому это можно использовать для динамического улучшения команд с профилированием времени. (Однако, с другой стороны, это требует дополнительного раунда цитирования)источник
Вместо использования cmd = 'time sleep 2' попробуйте использовать его как cmd = '/ usr / bin / time sleep 2', чтобы получить команду в реальном времени.
Вы можете прочитать следующее в man time:
Пользователи оболочки bash должны использовать явный путь для запуска внешней команды времени, а не встроенный вариант оболочки. В системе, в которой время установлено в / usr / bin, первым примером будет / usr / bin / time wc / etc / hosts
источник