Как я могу перенаправить вывод команды «время»? - PullRequest
86 голосов
/ 09 марта 2010

Я попытался перенаправить вывод команды времени, но не смог:

$time ls > filename
real    0m0.000s
user    0m0.000s
sys     0m0.000s

В файле я вижу вывод команды ls, а не time. Пожалуйста, объясните, почему я не смог и как это сделать.

Ответы [ 6 ]

116 голосов
/ 09 марта 2010

нет необходимости запускать субоболочку. Использование блока кода также подойдет.

{ time ls; } 2> out.txt

или

{ time ls > /dev/null 2>&1 ; } 2> out.txt
96 голосов
/ 09 марта 2010

вы можете перенаправить вывод времени, используя,

(time ls) &> file

Поскольку вам нужно взять (time ls) как одну команду, чтобы вы могли использовать фигурные скобки.

22 голосов
/ 09 марта 2010

Время команды отправляет свой вывод в STDERR (вместо STDOUT). Это потому, что команда, выполняемая со временем, обычно (в данном случае ls), выводит в STDOUT.

Если вы хотите захватить вывод времени, введите:

(time ls) 2> filename

Это захватывает только вывод времени, но вывод ls идет нормально на консоль. Если вы хотите записать оба файла в один файл, введите:

(time ls) &> filename

2> перенаправляет STDERR, а> перенаправляет оба.

9 голосов
/ 09 марта 2010

время встроено в оболочку, и я не уверен, есть ли способ перенаправить его. Однако вы можете использовать /usr/bin/time вместо этого, которые определенно принимают любые перенаправления вывода.

3 голосов
/ 13 января 2015

Если вы не хотите смешивать вывод из time и команду. Со временем GNU вы можете использовать -o file, например:

/usr/bin/time -o tim grep -e k /tmp 1>out 2>err

, в то время как tim является выводом времени, out и err - это стандартный вывод и стандартный вывод grep.

2 голосов
/ 02 марта 2018

Причина, по которой перенаправление не работает с time, заключается в том, что это зарезервированное для bash слово (не встроенное!) При использовании перед конвейером. Баш (1):

Если слово, зарезервированное во времени, предшествует конвейеру, пользовательское и системное время, затраченное на его выполнение, сообщается, когда трубопровод прекращается.

Итак, чтобы перенаправить вывод time, используйте фигурные скобки:

{ time ls; } 2> filename

Или позвоните /usr/bin/time:

/usr/bin/time ls 2> filename
...