Dans ksh, bashet zsh, timen'est pas une commande (intégrée ou non), c'est un mot réservé dans la langue comme forou 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> errorcommande 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-outputavant 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 timeconstruction 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 timeconstruction est invoquée.
La plupart des systèmes ont également une timecommande. Vous pouvez l'invoquer en désactivant le timemot 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 timeet cmdsera fusionné error-and-timing-output.
De plus, la timecommande, contrairement à la timeconstruction, 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 bashexiste (ce qui peut être considéré comme) un bogue par lequel time (cmd) 2> file(mais pas time cmd | (cmd2) 2> filepar exemple) redirige la sortie de synchronisation versfile
times'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 à untimeprocessus). Et n'oublions pas ceux qu'implique le()sous - shell. (en attente d'un spécialiste bash : p)