Em ksh, bashe zsh, timenão é um comando (embutido ou não), é uma palavra reservada no idioma como forou while.
É usado para cronometrar um pipeline 1 .
Dentro:
time for i in 1 2; do cmd1 "$i"; done | cmd2 > redir
Você tem uma sintaxe especial que informa ao shell para executar essa linha de tubulação:
for i in 1 2; do cmd1 "$i"; done | cmd2 > redir
E relate estatísticas de tempo para isso.
Dentro:
time cmd > output 2> error
É o mesmo, você está cronometrando o cmd > output 2> errorcomando e as estatísticas de cronometragem ainda continuam 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 que o stderr do shell seja redirecionado para timing-outputantes da construção da hora (novamente, não do comando ) ser usada (aqui para a hora cmd > output 2> error 3>&-).
Você também pode executar essa timeconstrução em um subshell que tenha seu stderr redirecionado:
(time cmd > output 2> error) 2> timing-output
Mas esse subshell não é necessário aqui, você só precisa que o stderr seja redirecionado no momento em que a timeconstrução é invocada.
A maioria dos sistemas também possui um timecomando. Você pode invocar essa desativando a timepalavra - chave. Tudo que você precisa fazer é citar essa palavra-chave de alguma forma, pois as palavras-chave são reconhecidas como tal apenas quando literais.
'time' cmd > output 2> error-and-timing-output
Mas cuidado, o formato pode ser diferente e o stderr de ambos timee cmdserá mesclado error-and-timing-output.
Além disso, o timecomando, ao contrário da timeconstrução, não pode cronometrar pipelines ou comandos ou funções compostas ou embutidos no shell ...
Se fosse um comando interno, ele poderá cronometrar invocações ou funções internas de função, mas não poderá cronometrar redirecionamentos, pipelines ou comandos compostos.
1 Observe que bashpossui (o que pode ser considerado) um erro pelo qual time (cmd) 2> file(mas não time cmd | (cmd2) 2> filepor exemplo) redireciona a saída de temporização parafile
timeda palavra-chave shell ou/usr/bin/time. Pode haver vários conjuntos de descritores envolvidos aqui (o shell e os anexados a umtimeprocesso). E não vamos esquecer os implícitos no()subshell. ( Esperando por um especialista do bash : p)