Bash рассматривает встроенное timeкак особый случай при разборе командных строк.
Как можно прочитать на man-странице bash, набранная строка сначала разбивается на список:
pipeline ; pipeline
где трубопровод:
[time [-p]] [ ! ] command [ [|⎪|&] command2 ... ]
или в нашем случае просто:
time command
т.е. если время присутствует, то команда должна также присутствовать.
[Существует особый случай, который позволяет timeследовать за новой строкой, но это не относится здесь]
Итак, в нашем случае мы имеем:
time;date
разделяется на два трубопровода:
1. time
2. date
и конвейер 1 не очень хорошо сформирован, так как у нас timeбез команды. Отсюда и ошибка.
Обратите внимание, что командная строка timeздесь тоже не работает:
$ /usr/bin/time;date
Usage: /usr/bin/time [-apvV] [-f format] [-o file] [--append] [--verbose]
bash разбирает это, как и ожидалось, на 2 конвейера:
1. /usr/bin/time
2. date
а /usr/bin/timeзатем отказывается бежать без аргументов. Обратите внимание, что это ошибка, а /usr/bin/timeне ошибка bash.
Причина, по которой обратная галочка работает, заключается в том, что обратная галочка перестает timeинтерпретироваться как специальный элемент в конвейере.
то есть с обратной галочкой:
`time`;date
он разбирается как два конвейера:
1. `time`
2. date
Помните, что конвейер в нашем случае это:
[time] command
и проблема изначально заключалась в том, что у нас не timeбыло команды, что запрещено. Но теперь у нас просто есть команда:
`time`
без предшествующего time, поскольку обратные галочки означают, что timeинтерпретируется как команда, а не как предыдущее слово.
Таким образом, bash запускает свою встроенную систему timeбез аргументов, что принимается. Он не производит вывод, и мы не видим ошибки.
Обратите внимание, что:
`time`
фактически запускает результат из timeвстроенной, то есть он работает независимо от timeвстроенного производит на стандартный вывод. Но поскольку сам timeпо себе ничего не пишет в stdout, похоже, он работает.
Наконец, было отмечено, что это работает:
time ; ; date
что я не могу объяснить, к сожалению :)
time;dateпротивdate;time. Это, похоже, проблема с конвейеромbashи последним символом, сгенерированным сtimeвыходом. Результаты тестирования в различных эмуляторах терминала: - [Bash] $ date; time # [OK] $ time; date # [ NotOK ] bash: синтаксическая ошибка рядом с неожиданным токеном `date '$ time # только ошибка не появляется, что это результат любой даты. - [Csh] $ date; время # [OK] $ время; date # [OK] - [Tcsh] $ date; время # [OK] $ время; date # [OK] - [Ksh] $ date; время # [ OK] $ time; дата # [OK]