web-dev-qa-db-fra.com

Comment puis-je rediriger la sortie de la commande "time"?

J'ai essayé de rediriger 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 de time. Veuillez expliquer pourquoi je n'ai pas pu et comment procéder.

88
abubacker

vous pouvez rediriger 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.

97
sganesh

pas besoin de lancer sub Shell. Utiliser un bloc de code fera aussi l'affaire.

{ time ls; } 2> out.txt

ou

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

Le temps de commande envoie sa sortie à STDERR (au lieu de STDOUT). C'est parce que la commande exécutée avec le temps normalement (dans ce cas ls) sort vers 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 est normale à la console. Si vous souhaitez capturer les deux dans un seul fichier, tapez:

(time ls) &> filename

2> redirige STDERR, &> redirige les deux.

22
Mnementh

le temps est intégré à Shell et je ne sais pas s'il y a moyen de le rediriger. Cependant, vous pouvez utiliser /usr/bin/time à la place, qui accepte définitivement toutes les redirections de sortie.

9
Michal Čihař

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

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

tandis que tim est une sortie de temps, out et err sont stdout et stderr de grep.

3
Ding-Yi Chen

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

Si le temps réservé Word 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 rediriger la sortie de time, utilisez des accolades:

{ time ls; } 2> filename

Ou appeler /usr/bin/time:

/usr/bin/time ls 2> filename
2
user1338062