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