Dans ksh
, bash
et zsh
, time
n'est pas une commande (intégrée ou non), c'est un mot réservé dans la langue comme for
ou while
.
Il est utilisé pour chronométrer un pipeline 1 .
Dans:
time for i in 1 2; do cmd1 "$i"; done | cmd2 > redir
Vous avez une syntaxe spéciale qui indique au shell d'exécuter cette ligne de tuyau:
for i in 1 2; do cmd1 "$i"; done | cmd2 > redir
Et rapportez des statistiques de synchronisation pour cela.
Dans:
time cmd > output 2> error
C'est la même chose, vous chronométrez la cmd > output 2> error
commande et les statistiques de chronométrage vont toujours sur le stderr du shell.
Vous avez besoin:
{ 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>&-
Pour que le stderr du shell soit redirigé vers timing-output
avant que la construction de temps (encore une fois, pas de commande ) soit utilisée (ici pour le temps cmd > output 2> error 3>&-
).
Vous pouvez également exécuter cette time
construction dans un sous - shell dont le stderr est redirigé:
(time cmd > output 2> error) 2> timing-output
Mais ce sous-shell n'est pas nécessaire ici, vous n'avez besoin que de stderr pour être redirigé au moment où la time
construction est invoquée.
La plupart des systèmes ont également une time
commande. Vous pouvez l'invoquer en désactivant le time
mot clé. Tout ce que vous avez à faire est de citer ce mot-clé, car les mots-clés ne sont reconnus comme tels que lorsqu'ils sont littéraux.
'time' cmd > output 2> error-and-timing-output
Mais attention, le format peut être différent et le stderr des deux time
et cmd
sera fusionné error-and-timing-output
.
De plus, la time
commande, contrairement à la time
construction, ne peut pas chronométrer les pipelines ou les commandes ou fonctions composées ou les commandes intégrées au shell ...
S'il s'agissait d'une commande intégrée, elle pourrait peut-être chronométrer les invocations de fonctions ou les commandes intégrées, mais elle ne pourrait pas chronométrer les redirections ou les pipelines ou les commandes composées.
1 Notez qu'il bash
existe (ce qui peut être considéré comme) un bogue par lequel time (cmd) 2> file
(mais pas time cmd | (cmd2) 2> file
par exemple) redirige la sortie de synchronisation versfile
time
s'agit du mot clé shell ou/usr/bin/time
. Il peut y avoir plusieurs ensembles de descripteurs impliqués ici (ceux du shell et ceux attachés à untime
processus). Et n'oublions pas ceux qu'implique le()
sous - shell. (en attente d'un spécialiste bash : p)