Перенаправить вывод команды в `time command`

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

Любые идеи?

Дэвид Дория
источник
Я использую команду времени в файле сценария. я хочу вывод времени в стандартный вывод вместо стандартного. как я могу получить это?
связанные: stackoverflow.com/questions/13356628/…
Сиро Сантилли 冠状 病毒 审查 六四 事件 法轮功

Ответы:

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

Если вы используете версию автономной timeутилиты GNU , у нее есть -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) Что делает «exec» в вашем последнем предложении? Кажется, что работает без него: / 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 /dev/fd/0и т. д.).
Жиль "ТАК - перестань быть злым"
@DavidDoria Изменение того, к чему подключен файловый дескриптор, происходит слева направо, что имеет противоположный эффект. См. Unix.stackexchange.com/questions/23964/… или unix.stackexchange.com/questions/37660/order-of-redirections
Жиль "
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
Артур Шимчак
источник
Это не то же самое «время» (я верю, что это псевдоним bash). Обратите внимание, что он не следует разумным правилам перенаправления? $ time &> / dev / null real 0m0.000s пользователь 0m0.000s sys 0m0.000s
Дэвид Дория
1
Как насчет этого: / usr / bin / time -o time / usr / bin / find / etc / pki / CA / private / &> / dev / null; время кошки
Артур Шимчак
Да, я видел это, но мне было просто любопытно, как это сделать без использования внутреннего механизма, такого как -o.
Дэвид Дория
@DavidDoria Что создает у вас впечатление timeпсевдонима bash? which timeотображается /usr/bin/timeв CentOS 5.7.
Тимоти Мартин
type timeпокажет вам:time is a shell keyword
Артур Шимчак