В 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)