Comment puis-je rediriger la sortie de la commande «time»?


95

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 lscommande, pas celle de time. Veuillez expliquer pourquoi je ne pouvais pas et comment faire cela.


1
Devrait être sur Superuser, je pense.
Mnementh

1
La réponse à cette question d'intérêt non seulement pour les programmeurs, mais aussi pour les autres utilisateurs
expérimentés

Réponses:


104

vous pouvez rediriger la sortie de l'heure en utilisant,

(time ls) &> file

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


1
ouais très bien, mais la question est de savoir comment ils ont fait ça?
abubacker

2
La commande time prendra les arguments comme une commande. Mais les parenthèses regrouperont cela comme une seule commande. Ex: time ls> file1.txt En arguments, 0 = time 1 = "ls> file1.txt"
sganesh

8
Et la commande time imprime la sortie dans stderr. Vous pouvez donc utiliser (time ls) 2> file
sganesh

5
Clarification sur le &>s'il vous plaît, où puis-je en savoir plus?
hello_there_andy

3
@hello_there_andy &>fileest analogue à >file 2>&1. Il dirige à la fois stdout et stderr.
ktbiz

129

pas besoin de lancer le sous-shell. Utiliser un bloc de code fera également l'affaire.

{ time ls; } 2> out.txt

ou

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

1
D'accord, meilleure réponse. Vous donne la possibilité d'abandonner les résultats de ls et d'obtenir juste le temps. Merci ghostdog74
rd42

1
Cela fonctionnait avec AIX lorsque rien ne pouvait rediriger la sortie de la commande "hostent". Je vous remercie!
Hugo

1
Clarification sur le 2>s'il vous plaît. Où puis-je en savoir plus?
hello_there_andy

3
comment faire si je veux à la fois> et 2> en même temps?
Jorge Fernández

25

La commande time 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 sur STDOUT.

Si vous souhaitez capturer la sortie du temps, tapez:

(time ls) 2> filename

Cela capture uniquement la sortie du temps, mais la sortie de ls devient normale pour la console. Si vous souhaitez capturer les deux dans un seul fichier, tapez:

(time ls) &> filename

2> redirige STDERR, &> redirige les deux.


1
Cette réponse répond en fait à la raison pour laquelle la redirection du PO ne fonctionnait pas, ce qui était l'une des questions que le PO se posait. Personne d'autre ne résout cela.
NeutronStar le

comment un tuyau à un autre processus avec cela?
Paul

10

le temps est intégré au shell et je ne suis pas sûr qu'il existe un moyen de le rediriger. Cependant, vous pouvez utiliser à la /usr/bin/timeplace, qui accepte définitivement toutes les redirections de sortie.


/ usr / bin / time --output filename ls
chub

4
Le temps intégré fonctionne bien avec la redirection de sortie. Il sort uniquement sur STDERR, pas sur STDOUT.
Mnementh

Le problème est que les commandes intégrées sont exécutées dans l'environnement du shell lui-même, pas dans un sous-shell. Puisque le stderr de votre shell est généralement connecté au terminal, la redirection ne fera rien. Pour rediriger le temps intégré, je pense que vous devez faire quelque chose comme bash time mycmd 2>file. Ou appelez simplement /usr/bin/timecomme cela a été mentionné.
ktbiz

Vous pouvez également utiliser le non-intégré sans spécifier le chemin complet: stackoverflow.com/questions/29540540/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

4

Si vous ne souhaitez pas mélanger la sortie de timeet la commande. Avec GNU time, vous pouvez utiliser -o filecomme:

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

while timest la sortie du temps, outet errsont stdout et stderr de grep.


4

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

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

Donc, pour rediriger la sortie de time, utilisez des accolades:

{ time ls; } 2> filename

Ou appelez /usr/bin/time:

/usr/bin/time ls 2> filename

0

J'utilise la redirection de la méthode stdout et stderr avec des accolades pour les tests.
Le &>>rptreprésente ceci >>rpt 2>&1mais plus court.
Les accolades exécuteront une ou plusieurs commandes dans le shell actuel. Voir: man bash

{ time ls a*; } &>>rpt
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.