Як я можу перенаправити висновок команди "час"?


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 прийме аргументи як команду. Але дужки згрупують це як одну команду. Приклад: час ls> file1.txt В аргументах 0 = час 1 = "ls> file1.txt"
sganesh

8
І команда time виводить вихідні дані у stderr. Тож ви можете використовувати (time ls) 2> файл
sganesh

5
Пояснення, &>будь ласка, де я можу про них дізнатися?
hello_there_andy

3
@hello_there_andy &>fileє аналогом >file 2>&1. Він спрямовує як stdout, так і stderr.
ktbiz

129

немає необхідності запускати допоміжну оболонку. Використовуйте також код коду.

{ time ls; } 2> out.txt

або

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

1
Згоден, найкраща відповідь. Дає вам можливість скинути результати ls і просто отримати час. Дякую ghostdog74
rd42

1
Це працювало з AIX, коли ніщо не могло перенаправити висновок команди "хост". Дякую!
Гюго

1
Роз’яснення на 2>будь-який прохання. Де я можу про них дізнатися?
hello_there_andy

3
як це зробити, якщо я хочу одночасно і>, і 2>?
Хорхе Фернандес

25

Команда часу надсилає свій вихід на STDERR (замість STDOUT). Це тому, що команда, що виконується з часом, зазвичай (у цьому випадку ls) виводить на STDOUT.

Якщо ви хочете зафіксувати результат часу, введіть:

(time ls) 2> filename

Це фіксує лише вихідний час, але вихід ls йде нормально до консолі. Якщо ви хочете зберегти обидва в одному файлі, введіть:

(time ls) &> filename

2> переспрямовує STDERR, &> переспрямовує обидва.


1
Ця відповідь насправді відповідає, чому переспрямування OP не працювало, що було одним із питань, які ставив OP. Більше ніхто до цього не звертається.
NeutronStar

як би з цим переходити одна труба до іншої?
Пол

10

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


/ usr / bin / time - вихідне ім'я файлу ls
chub

4
Вбудований час добре працює з переспрямуванням виводу. Виводиться лише на STDERR, а не на STDOUT.
Мнемент

Проблема полягає в тому, що вбудовані команди виконуються в самому середовищі оболонки, а не під оболонкою. Оскільки stderr вашої оболонки зазвичай підключений до терміналу, переспрямування нічого не допоможе. Щоб перенаправити вбудований час, я вважаю, що вам доведеться зробити щось на зразок bash time mycmd 2>file. Або просто зателефонувати, /usr/bin/timeяк згадувалося.
ktbiz

Крім того, можна використовувати без вбудованого без вказівки повного шляху: stackoverflow.com/questions/29540540 / ...
Чіро Сантіллі郝海东冠状病六四事件法轮功

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 (а не вбудоване!), Коли воно використовується перед конвеєром. баш (1):

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

Отже, для переспрямування виводу time, використовуйте фігурні дужки:

{ time ls; } 2> filename

Або зателефонуйте /usr/bin/time:

/usr/bin/time ls 2> filename

0

Для тестування я використовую перенаправлення методу stdout та stderr з дужками.
Це &>>rptпредставляє це, >>rpt 2>&1але коротше.
Фігурні дужки виконують команду (команди) у поточній оболонці. Дивіться: людина баш

{ time ls a*; } &>>rpt
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.