Перенаправити висновок команди в команді "час"


11

Я намагаюся час щось використовувати, використовуючи:

/usr/bin/time myCommand

Однак, оскільки /usr/bin/timeпише в stderr, якщо myCommand також пише в stderr, я отримаю більше, ніж просто час виведення в потік. Що я хочу зробити, це перенаправити весь висновок myCommand на /dev/null, але все-таки записати час виводу на stderr. Використовуючи приклад myCommand, який пише в stderr of ls /nofile, ми бачимо, що (очевидно) взагалі немає виводу з наступним:

$ /usr/bin/time ls /nofile 2> /dev/null
$

Без будь-якого перенаправлення ми бачимо як вихід з ls(на stderr), так і вихід з часу (також на stderr):

$ /usr/bin/time ls /nofile
ls: cannot access /nofile: No such file or directory
0.00user 0.00system 0:00.00elapsed 0%CPU (0avgtext+0avgdata 3776maxresident)k
0inputs+0outputs (0major+278minor)pagefaults 0swaps

Те, що я хочу, - це те, що просто виробляє:

$ /usr/bin/time ls /nofile > RedirectThatImAskingFor
0.00user 0.00system 0:00.00elapsed 0%CPU (0avgtext+0avgdata 3776maxresident)k
0inputs+0outputs (0major+278minor)pagefaults 0swaps

Будь-які ідеї?


Я використовую команду часу у файлі сценарію. Я хочу вивести час у stdout замість stderr. як я можу це отримати?

Відповіді:


20

У ksh, bash та zsh time- це ключове слово, а не вбудований. Перенаправлення в одному рядку поширюються лише на тимчасову команду, а не на сам вихід time.

$ time ls -d / /nofile >/dev/null 2>/dev/null

real    0m0.003s
user    0m0.000s
sys     0m0.000s

Щоб перенаправити вихід із timeсебе в ці оболонки, потрібно використовувати додатковий рівень групування.

{ time mycommand 2>&3; } 3>&2 2>mycommand.time

Якщо ви використовуєте GNU-версію автономної timeутиліти, вона має -oможливість записувати вихід в timeіншому місці, ніж stderr. Ви можете зробити timeзапис у термінал:

/usr/bin/time -o /dev/tty mycommand >/dev/null 2>/dev/null

Якщо ви хочете зберегти вихідну інформацію від timeїї стандартної помилки, вам потрібен додатковий рівень перемішування дескриптора файлів.

/usr/bin/time -o /dev/fd/3 mycommand 3>&2 >/dev/null 2>/dev/null

За допомогою будь-якої timeутиліти ви можете викликати проміжну оболонку для виконання бажаних переадресацій. Викликати проміжну оболонку для виконання додаткових дій, таких як cd, перенаправлення тощо, є досить поширеним явищем - це такі дрібниці, які оболонки призначені для виконання.

/usr/bin/time sh -c 'exec mycommand >/dev/null 2>/dev/null'

Кілька наступних заходів: 1) Що робить "виконавець" у вашій останній пропозиції? Здається, це працює без нього: / usr / bin / time sh -c 'exec ls / nofile &> ./ output.dat' 2) "Проміжний оболонку" такий же, як "нижня оболонка" (яку ви отримаєте я подумайте, використовуючи дужки?). Я намагався такі речі, як / usr / bin / time (ls / nofile &> ./ output.dat), безрезультатно. 3) Що таке / dev / tty? Я знаю, що tty0 - це stdin, tty1 = stdout, tty2 = stderr, але як бути з "tty"?
Девід Дорія

4) За допомогою параметра / dev / fd3, здається, ви говорите, щоб записати вихід -o до 3, потім перенаправити 3 на 2, 1 на нуль і 2 на нуль. Чи не слід це надсилати 3 до нуля також, оскільки перенаправлення трапляються зліва направо?
Девід Дорія

1
@DavidDoria execзамінює оболонку вказаною програмою, а не виконує цю програму як підпроцес. Деякі оболонки виконують цю оптимізацію автоматично, коли команда остання в сценарії. "Проміжна оболонка" означає саме це: оболонку, яка знаходиться між timeі mycommand; вона не пов'язана з підшарами. /dev/ttyце термінал, на якому працює команда (це не пов'язано з /dev/ttyNUMякими фізичними консолями; ви плутаєте дескриптори файлів: stdin is /dev/fd/0тощо).
Жил "ТАК - перестань бути злим"

@DavidDoria Зміна того, до чого пов'язаний дескриптор файлу, відбувається зліва направо, що має протилежний ефект. Дивіться unix.stackexchange.com/questions/23964/… або unix.stackexchange.com/questions/37660/order-of-redirections
"SO - перестань бути злим"

0
[artur@asus-ux21e ~]$ find /etc/pki/CA/private/
/etc/pki/CA/private/
find: ‘/etc/pki/CA/private/’: Permission denied
[artur@asus-ux21e ~]$ time (find /etc/pki/CA/private/ &> /dev/null)

real    0m0.006s
user    0m0.001s
sys 0m0.004s

Це не той самий "час" (я вважаю, це псевдонім башти). Зауважте, що воно не відповідає жодним правильним правилам перенаправлення? $ time &> / dev / null real 0m0.000s користувач 0m0.000s sys 0m0.000s
David Doria

1
Як щодо цього: / usr / bin / time -o time / usr / bin / find / etc / pki / CA / private / &> / dev / null; час для котів
Артур Шемчак

Так, я це бачив, але мені було просто цікавіше, як це зробити, не використовуючи внутрішній механізм, як -o.
Девід Дорія

@DavidDoria Що створює враження, що timeце псевдонім башти ? which timeвідображається /usr/bin/timeв CentOS 5.7.
Тимофій Мартін

type timeпокаже вам:time is a shell keyword
Artur Szymczak
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.