Em ksh
, bash
e zsh
, time
não é um comando (embutido ou não), é uma palavra reservada no idioma como for
ou 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> error
comando 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-output
antes 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 time
construçã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 time
construção é invocada.
A maioria dos sistemas também possui um time
comando. Você pode invocar essa desativando a time
palavra - 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 time
e cmd
será mesclado error-and-timing-output
.
Além disso, o time
comando, ao contrário da time
construçã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 bash
possui (o que pode ser considerado) um erro pelo qual time (cmd) 2> file
(mas não time cmd | (cmd2) 2> file
por exemplo) redireciona a saída de temporização parafile
time
da palavra-chave shell ou/usr/bin/time
. Pode haver vários conjuntos de descritores envolvidos aqui (o shell e os anexados a umtime
processo). E não vamos esquecer os implícitos no()
subshell. ( Esperando por um especialista do bash : p)