В ksh
, bash
и zsh
, время
не является командой (встроенной или нет), это зарезервированное слово в язык вроде для
или , а
.
Используется для измерения времени конвейера 1 .
In:
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 оболочки был перенаправлен на time-output
до того, как будет использована конструкция времени (опять же, не команда ) ( здесь время cmd> output 2> error 3> & -
).
Вы также можете запустить эту конструкцию time
в подоболочке , у которой перенаправлен stderr:
(time cmd > output 2> error) 2> timing-output
Но эта подоболочка здесь не нужна, вам нужно только перенаправить stderr в время вызова конструкции time
.
В большинстве систем также есть команда время
. Вы можете вызвать его, отключив ключевое слово time
. Все, что вам нужно сделать, это как-то процитировать это ключевое слово, поскольку ключевые слова распознаются как таковые только в буквальном смысле.
'time' cmd > output 2> error-and-timing-output
Но будьте осторожны, формат может быть другим, и stderr для time
и cmd
будет объединен в error-and-time-output
.
Кроме того, команда time
, в отличие от конструкции time
, не может синхронизировать конвейеры, составные команды, функции или встроенные функции оболочки ...
Если бы это была встроенная команда , он может синхронизировать вызовы функций или встроенные команды, но не может синхронизировать перенаправления, конвейеры или составные команды.
1 Обратите внимание, что bash
имеет (что можно рассматривать как) ошибку , при которой time (cmd) 2> file
(но не time cmd | (cmd2) 2> file
например) перенаправляет вывод синхронизации в файл
Для всех, кто сталкивается с подобной проблемой, в данном конкретном случае проблема была вызвана ошибкой в виртуальной машине Ruby версии 1.27.4, которая была установлена на этих облачных серверах как часть образа.
Ошибка RVM заключалась в сценариях, которые переопределяли обычные функции (, такие как cd ), где SIGINT перехватывался, но не освобождался при очистке. Более подробную информацию можно найти здесь Ошибка Ruby RVM
Исправление в этом случае заключалось в обновлении RVM до последней стабильной версии (, в данном случае 1.29.7 ).
curl -sSL https://get.rvm.io | bash -s stable --ruby
Спасибо mosvy за указатель.