Comment puis-je redirect la sortie de la commande “time”?

J’ai essayé de redirect la sortie de la commande time, mais je n’ai pas pu:

$time ls > filename real 0m0.000s user 0m0.000s sys 0m0.000s 

Dans le fichier, je peux voir la sortie de la commande ls , pas celle du time . S’il vous plaît expliquer, pourquoi je ne pouvais pas et comment faire cela.

vous pouvez redirect la sortie de temps en utilisant,

 (time ls) &> file 

Parce que vous devez prendre (time ls) comme une seule commande pour pouvoir utiliser des accolades.

pas besoin de lancer un sous-shell. Utiliser un bloc de code fera aussi bien.

 { time ls; } 2> out.txt 

ou

 { time ls > /dev/null 2>&1 ; } 2> out.txt 

Le temps de commande envoie la sortie à STDERR (au lieu de STDOUT). C’est parce que la commande exécutée avec le temps normalement (dans ce cas ls) sort sur STDOUT.

Si vous souhaitez capturer la sortie du temps, tapez:

 (time ls) 2> filename 

Cela ne capture que la sortie du temps, mais la sortie de ls va normalement à la console. Si vous souhaitez capturer à la fois dans un fichier, tapez:

 (time ls) &> filename 

2> redirige STDERR, &> redirige les deux.

le temps est un shell intégré et je ne suis pas sûr qu’il existe un moyen de le redirect. Cependant, vous pouvez utiliser /usr/bin/time , qui accepte définitivement les redirections de sortie.

Si vous ne voulez pas mélanger la sortie du time et la commande. Avec le temps GNU, vous pouvez utiliser -o file comme:

 /usr/bin/time -o tim grep -ek /tmp 1>out 2>err 

alors que tim est la sortie de time, out et err sont stdout et stderr de grep .

La raison pour laquelle la redirection ne semble pas fonctionner avec le time est que c’est un mot réservé bash (pas un!) Lorsqu’il est utilisé devant un pipeline. bash (1):

Si le mot de temps réservé précède un pipeline, le temps écoulé ainsi que le temps utilisateur et système consommé par son exécution sont signalés à la fin du pipeline.

Donc, pour redirect la sortie du time , utilisez des accolades:

 { time ls; } 2> filename 

Ou appelez /usr/bin/time :

 /usr/bin/time ls 2> filename