Em ksh
, bash
e zsh
, time
não é um comando (incorporado ou não), é uma palavra reservada na linguagem como for
ou while
.
Está acostumado a cronometrar um pipeline 1 .
Em:
time for i in 1 2; do cmd1 "$i"; done | cmd2 > redir
Você tem uma sintaxe especial que diz ao shell para executar essa linha de tubulação:
for i in 1 2; do cmd1 "$i"; done | cmd2 > redir
E informe estatísticas de tempo para isso.
Em:
time cmd > output 2> error
É o mesmo, você está timing no comando cmd > output 2> error
, e as estatísticas de tempo ainda vão no stderr do shell.
Você precisa:
{ time cmd > output 2> error; } 2> timing-output
Ou:
exec 3>&2 2> timing-output
time cmd > output 2> error 3>&-
exec 2>&3 3>&-
Para o stderr do shell ser redirecionado para timing-output
antes da construção da hora (novamente, não comando ) é usado (aqui para a hora cmd > output 2> error 3>&-
).
Você também pode executar a construção time
em um subshell que tenha seu stderr redirecionado:
(time cmd > output 2> error) 2> timing-output
Mas essa subshell não é necessária aqui, você só precisa que o stderr seja redirecionado no momento em que time
construct é invocado.
A maioria dos sistemas também possui um comando time
. Você pode invocar essa desativando a palavra-chave time
. Tudo o que você precisa fazer é citar essa palavra-chave de alguma forma, pois as palavras-chave só são reconhecidas como tal quando são literais.
'time' cmd > output 2> error-and-timing-output
Mas cuidado, o formato pode ser diferente e o stderr de time
e cmd
será mesclado em error-and-timing-output
.
Além disso, o comando time
, em oposição à construção time
, não pode deduzir tempo em pipelines ou compor comandos ou funções ou recursos internos do shell ...
Se fosse um comando interno, poderia ser capaz de invocar invocações de tempo ou funções internas, mas não poderia redirecionar redirecionamentos, pipelines ou comandos compostos.
1 Note que bash
tem (o que pode ser considerado como um bug pelo qual time (cmd) 2> file
(mas não time cmd | (cmd2) 2> file
, por exemplo) redireciona a saída de tempo para file