Redireciona a saída de um comando em 'time command'

8

Estou tentando agendar algo usando:

/usr/bin/time myCommand

No entanto, como /usr/bin/time grava em stderr, se myCommand também gravar em stderr, terei mais do que apenas a saída do tempo no fluxo. O que eu quero fazer é redirecionar toda a saída do myCommand para /dev/null , mas ainda gravar a saída do tempo em stderr. Usando um exemplo myCommand que escreve para stderr de ls /nofile , vemos que (obviamente) não há saída alguma com o seguinte:

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

Sem nenhum redirecionamento, vemos a saída de ls (para stderr) e a saída de hora (também para 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

O que eu quero é algo que simplesmente produz:

$ /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

Alguma idéia?

    
por David Doria 22.04.2014 / 20:30

2 respostas

13

Em ksh, bash e zsh, time é uma palavra-chave, não uma incorporada. Redirecionamentos na mesma linha aplicam-se apenas ao comando que está sendo cronometrado, e não à saída de time em si.

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

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

Para redirecionar a saída do time nesses shells, você precisa usar um nível adicional de agrupamento.

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

Se você usar a versão GNU do utilitário time autônomo, ele terá uma opção -o para gravar a saída de time em outro lugar que stderr. Você pode fazer time escrever no terminal:

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

Se você quiser manter a saída de time em seu erro padrão, você precisa de um nível extra de embaralhamento do descritor de arquivo.

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

Com qualquer utilitário time , você pode invocar um shell intermediário para executar os redirecionamentos desejados. Invocar um shell intermediário para executar ações extras, como cd , redirecionamentos, etc., é bastante comum - é o tipo de pequenas coisas que os shells são projetados para fazer.

/usr/bin/time sh -c 'exec mycommand >/dev/null 2>/dev/null'
    
por 23.04.2014 / 04:44
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
    
por 22.04.2014 / 20:36