2010-03-09 5 views
64

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

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

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

+1

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

+1

Я так не считаю! – abubacker

+1

Ответ на этот вопрос не только интерес для программистов, но и для других пользователей: http://superuser.com/ – Mnementh

ответ

75

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

(time ls) &> file 

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

+0

Да, отлично, но вопрос в том, как они это сделали? – abubacker

+1

Команда времени примет аргументы как команду. Но скобки будут группировать это как одну команду. Ex: время Ls> FILE1.TXT В аргументах, 0 = время 1 = "LS> file1.txt" – sganesh

+5

И команда выводит время выхода в поток ошибок. Итак, вы можете использовать (время ls) 2> файл – sganesh

8

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

+0

/usr/bin/time --output filename ls – chub

+3

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

+0

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

16

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

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

(time ls) 2> filename 

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

(time ls) &> filename 

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

+1

Этот ответ на самом деле отвечает * почему * перенаправление OP не работает, что было одним из вопросов, заданных OP. Никто еще не обращается к этому. – Joshua

101

Не нужно запускать подклассу. Использовать кодовый блок также будет.

{ time ls; } 2> out.txt 

или

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

+1, Лучший ответ –

+0

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

+0

Это работало с AIX, когда ничто не могло перенаправить вывод команды «hostent». Спасибо! – Hugo

3

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

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

в то время как tim выводится время, out и err являются стандартный вывод и стандартный поток ошибок из grep.

0

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

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

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

{ time ls; } 2> filename 

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

/usr/bin/time ls 2> filename 
Смежные вопросы