Я попытался перенаправить вывод команды time, но не смог:
$time ls > filename
real 0m0.000s
user 0m0.000s
sys 0m0.000s
В файле я вижу результат выполнения ls
команды, а неtime
. Объясните, почему я не смог и как это сделать.
Я попытался перенаправить вывод команды time, но не смог:
$time ls > filename
real 0m0.000s
user 0m0.000s
sys 0m0.000s
В файле я вижу результат выполнения ls
команды, а неtime
. Объясните, почему я не смог и как это сделать.
Ответы:
вы можете перенаправить вывод времени, используя,
(time ls) &> file
Потому что вам нужно взять (time ls) как одну команду, чтобы вы могли использовать фигурные скобки.
&>
просьбе, где я могу об этом узнать?
&>file
аналогичен >file 2>&1
. Он управляет как stdout, так и stderr.
не нужно запускать суб-оболочку. Также можно использовать блок кода.
{ time ls; } 2> out.txt
или
{ time ls > /dev/null 2>&1 ; } 2> out.txt
2>
просьбе. Где я могу узнать об этом?
Команда time отправляет вывод в STDERR (вместо STDOUT). Это потому, что команда, выполняемая со временем, обычно (в данном случае ls) выводится в STDOUT.
Если вы хотите зафиксировать вывод времени, введите:
(time ls) 2> filename
Это фиксирует только вывод времени, но вывод ls идет нормально на консоль. Если вы хотите записать оба в один файл, введите:
(time ls) &> filename
2> перенаправляет STDERR, &> перенаправляет оба.
time - встроенная оболочка, и я не уверен, есть ли способ ее перенаправить. Однако вы можете использовать
/usr/bin/time
вместо него, который определенно принимает любые перенаправления вывода.
bash time mycmd 2>file
. Или просто позвоните, /usr/bin/time
как было сказано.
Причина, по которой перенаправление, похоже, не работает, time
заключается в том, что это зарезервированное слово bash (а не встроенное!) При использовании перед конвейером. bash (1):
Если зарезервированное слово времени предшествует конвейеру, истекшее, а также пользовательское и системное время, затраченное на его выполнение, сообщается при завершении конвейера.
Итак, чтобы перенаправить вывод time
, используйте фигурные скобки:
{ time ls; } 2> filename
Или позвоните /usr/bin/time
:
/usr/bin/time ls 2> filename
Для тестирования я использую перенаправление stdout и stderr с фигурными скобками.
Символ &>>rpt
представляет это, >>rpt 2>&1
но короче.
Фигурные скобки будут выполнять команду (ы) в текущей оболочке. Смотрите: man bash
{ time ls a*; } &>>rpt