Estou tentando cronometrar algo usando:
/usr/bin/time myCommand
No entanto, como /usr/bin/time
escreve no stderr, se o myCommand também grava no stderr, receberei 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 no stderr. Usando um exemplo myCommand que grava no stderr of 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 tempo (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 ideia?
io-redirection
time-utility
David Doria
fonte
fonte
Respostas:
No ksh, bash e zsh,
time
é uma palavra-chave, não um builtin. Os redirecionamentos na mesma linha aplicam-se apenas ao comando que está sendo cronometrado, não à saída emtime
si.Para redirecionar a saída de
time
si mesma nesses shells, você precisa usar um nível adicional de agrupamento.Se você usar a versão GNU do
time
utilitário independente , ele terá a-o
opção de gravar a saída detime
outro local que não o stderr. Você podetime
escrever no terminal:Se você deseja manter a saída
time
com erro padrão, é necessário um nível extra de embaralhamento do descritor de arquivo.Com qualquer
time
utilitário, você pode chamar um shell intermediário para executar os redirecionamentos desejados. Invocar um shell intermediário para executar ações extras comocd
redirecionamentos etc. é bastante comum - é o tipo de pequenas coisas que os shells são projetados para fazer.fonte
exec
substitui o shell pelo programa especificado em vez de executá-lo como um subprocesso. Alguns shells executam essa otimização automaticamente quando um comando é o último em um script. "Shell intermediário" significa exatamente isso: um shell que está entretime
emycommand
; não está relacionado a subcascas./dev/tty
é o terminal em que o comando está sendo executado (não tem relação com/dev/ttyNUM
os consoles físicos; você está confuso com os descritores de arquivo: stdin is/dev/fd/0
, etc).fonte
time
é um alias do bash?which time
é exibido/usr/bin/time
no CentOS 5.7.type time
irá mostrar-lhe:time is a shell keyword