В ksh
, bash
и zsh
, time
это не команда (встроенная или нет), это зарезервированное слово на языке, подобном for
или while
.
Используется для определения времени конвейера 1 .
В:
time for i in 1 2; do cmd1 "$i"; done | cmd2 > redir
У вас есть специальный синтаксис, который говорит оболочке запустить эту конвейерную линию:
for i in 1 2; do cmd1 "$i"; done | cmd2 > redir
И сообщить статистику времени для этого.
В:
time cmd > output 2> error
Это то же самое, что вы синхронизации с cmd > output 2> error
командой, и статистика синхронизации до сих пор идут на STDERR оболочки.
Тебе нужно:
{ time cmd > output 2> error; } 2> timing-output
Или:
exec 3>&2 2> timing-output
time cmd > output 2> error 3>&-
exec 2>&3 3>&-
Для перенаправления stderr оболочки timing-output
до использования конструкции времени (опять же, не команды ) (здесь до времени cmd > output 2> error 3>&-
).
Вы также можете запустить эту time
конструкцию в подоболочке с перенаправленным stderr:
(time cmd > output 2> error) 2> timing-output
Но эта подоболочка здесь не нужна, вам нужно только перенаправить stderr во время time
вызова конструкции.
У большинства систем также есть time
команда. Вы можете вызвать его, отключив time
ключевое слово. Все, что вам нужно сделать, это как-то процитировать это ключевое слово, так как ключевые слова распознаются как таковые только в буквальном смысле.
'time' cmd > output 2> error-and-timing-output
Но остерегайтесь формат может быть различным и STDERR обоих time
и cmd
будут объединены в error-and-timing-output
.
Кроме того, time
команда, в отличие от time
конструкции, не может синхронизировать конвейеры или составные команды или функции или встроенные функции оболочки ...
Если бы это была встроенная команда, она могла бы рассчитывать вызовы функций или встроенные функции, но не могла рассчитывать время перенаправлений, конвейеров или составных команд.
1 Обратите внимание, что в нем bash
есть (что можно рассматривать как) ошибка, из-за которой time (cmd) 2> file
(но не, time cmd | (cmd2) 2> file
например) перенаправляется вывод времени наfile
time
является ли ключевое слово shell, или/usr/bin/time
. Здесь может быть несколько наборов дескрипторов (оболочки и те, которые прикреплены кtime
процессу). И давайте не будем забывать о тех, которые подразумеваются под()
раковиной. (в ожидании специалиста по bash : p)