1
$ 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

Теперь возникает вопрос: почему встроенная функция работает в строке, а ключевое слово - нет?

2 ответа2

2

time поскольку ключевое слово GNU Bash имеет очень конкретное место, где принимается, см., например, синтаксис для конструкции конвейера команд:

Формат для конвейера - [time [-p]] [!] command1 [| command2 ...]

Это жестко закодирует позицию ключевого слова вне расширений (так как команда N будет там, где раскрываются параметры и переменные). Фактически, семантика применяется ко всему конвейеру, а не к команде, поэтому, вероятно, именно поэтому это должно быть ключевое слово.

Существует оболочка встроенный times (в POSIX специального встроенный), для этого расширение работает с первым слова может быть исполняемым файлом или оболочка встроенным.

В качестве альтернативы GNU coreutils содержит исполняемый файл /bin/time .

Фактически time является зарезервированным словом в POSIX Shell (хотя bash все равно распознает его в режиме posix (если только - следует по неочевидным причинам)).

Внутри выражения eval ключевые слова распознаются bash, поэтому их можно использовать для динамического улучшения команд с профилированием времени. (Однако, с другой стороны, это требует дополнительного раунда цитирования)

0

Вместо использования cmd = 'time sleep 2' попробуйте использовать его как cmd = '/usr/bin/time sleep 2', чтобы получить команду в реальном времени.

Вы можете прочитать следующее в man time:

Пользователи оболочки bash должны использовать явный путь для запуска внешней команды времени, а не встроенного варианта оболочки. В системе, где время установлено в /usr /bin, первым примером будет /usr /bin /time wc /etc /hosts

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .