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

95

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

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

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

Abubacker
источник
1
Думаю, должен быть на суперпользователе.
Mnementh
1
Ответ на этот вопрос интересует не только программистов, но и других
продвинутых
1
Возможный дубликат: Есть ли способ перенаправить вывод времени в файл в Linux?
Ciro Santilli 郝海东 冠状 病 六四

Ответы:

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
призрачная собака74
источник
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, &> перенаправляет оба.

Mnementh
источник
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
user1338062
источник
0

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

{ time ls a*; } &>>rpt
когнитивный
источник