Как я могу перенаправить вывод команды «время»?


95

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

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

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


1
Думаю, должен быть на суперпользователе.
Mnementh

1
Ответ на этот вопрос интересует не только программистов, но и других
продвинутых

Ответы:


104

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

(time ls) &> file

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


1
да, относительно хорошо, но вопрос в том, как они это сделали?
abubacker

2
Команда time примет аргументы как команду. Но скобки сгруппируют это как одну команду. Пример: time ls> file1.txt В аргументах 0 = time 1 = "ls> file1.txt"
sganesh

8
И команда time печатает вывод в stderr. Итак, вы можете использовать (time ls) 2> file
sganesh 09

5
Уточнение по &>просьбе, где я могу об этом узнать?
hello_there_andy

3
@hello_there_andy &>fileаналогичен >file 2>&1. Он управляет как stdout, так и stderr.
ktbiz

130

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

{ time ls; } 2> out.txt

или

{ time ls > /dev/null 2>&1 ; } 2> out.txt

1
Согласен, лучший ответ. Дает вам возможность отказаться от результатов ls и просто получить время. Спасибо ghostdog74
rd42

1
Это работало с AIX, когда ничто не могло перенаправить вывод команды "hostent". Спасибо!
Хьюго

1
Уточнение по 2>просьбе. Где я могу узнать об этом?
hello_there_andy

3
как мне это сделать, если мне нужны оба> и 2> одновременно?
Хорхе Фернандес-Идальго

25

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

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

(time ls) 2> filename

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

(time ls) &> filename

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


1
Этот ответ фактически отвечает, почему перенаправление OP не работало, что было одним из вопросов, которые задавал OP. Никто другой не занимается этим.
NeutronStar 01

как бы с этим обрабатывать один канал другому?
Пол

10

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


/ usr / bin / time - выходное имя файла ls
чуб

4
Встроенное время хорошо работает с перенаправлением вывода. Он выводит только на STDERR, но не на STDOUT.
Mnementh

Проблема в том, что встроенные команды выполняются в самой среде оболочки, а не в подоболочке. Поскольку stderr вашей оболочки обычно подключен к терминалу, перенаправление ничего не сделает. Чтобы перенаправить встроенное время, я считаю, вам нужно сделать что-то вроде bash time mycmd 2>file. Или просто позвоните, /usr/bin/timeкак было сказано.
ktbiz

Вы также можете использовать
невстроенный

4

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

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

while tim- это вывод времени, outа errиз stdout и stderr grep.


4

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

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

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

{ time ls; } 2> filename

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

/usr/bin/time ls 2> filename

0

Для тестирования я использую перенаправление stdout и stderr с фигурными скобками.
Символ &>>rptпредставляет это, >>rpt 2>&1но короче.
Фигурные скобки будут выполнять команду (ы) в текущей оболочке. Смотрите: man bash

{ time ls a*; } &>>rpt
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.