Come posso reindirizzare l'output del comando "time"?


95

Ho provato a reindirizzare l'output del comando time, ma non sono riuscito:

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

Nel file posso vedere l'output del lscomando, non quello di time. Per favore, spiega perché non ho potuto e come farlo.


1
Dovrebbe essere su Superuser, credo.
Mnementh

1
La risposta a questa domanda non interessa solo i programmatori, ma anche altri utenti esperti: superuser.com
Mnementh

Risposte:


104

puoi reindirizzare l'output temporale utilizzando,

(time ls) &> file

Perché devi prendere (time ls) come un singolo comando in modo da poter usare le parentesi graffe.


1
sì molto bene, ma la domanda è come hanno fatto?
abubacker

2
Il comando time prenderà gli argomenti come un comando. Ma la parentesi lo raggrupperà come un unico comando. Es: ora ls> file1.txt In argomenti, 0 = ora 1 = "ls> file1.txt"
sganesh

8
E il comando time stampa l'output in stderr. Quindi puoi usare (time ls) 2> file
sganesh

5
Chiarimento per &>favore, dove posso saperne di più?
hello_there_andy

3
@ hello_there_andy &>fileè analogo a >file 2>&1. Dirige sia stdout che stderr.
ktbiz

129

non è necessario avviare la sub shell. Anche usare un blocco di codice andrà bene.

{ time ls; } 2> out.txt

o

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

1
D'accordo, migliore risposta. Ti dà la possibilità di abbandonare i risultati di ls e ottenere solo il tempo. Grazie ghostdog74
rd42

1
Funzionava con AIX quando nulla poteva reindirizzare l'output del comando "hostent". Grazie!
Hugo

1
Chiarimento per 2>favore. Dove posso saperne di più?
hello_there_andy

3
come faccio se voglio entrambi> e 2> allo stesso tempo?
Jorge Fernández

25

Il tempo di comando invia il suo output a STDERR (invece che a STDOUT). Questo perché il comando eseguito normalmente con il tempo (in questo caso ls) viene inviato a STDOUT.

Se vuoi catturare l'output del tempo, digita:

(time ls) 2> filename

Ciò cattura solo l'output del tempo, ma l'output di ls torna normale alla console. Se vuoi catturare entrambi in un file, digita:

(time ls) &> filename

2> reindirizza STDERR e> reindirizza entrambi.


1
Questa risposta in realtà risponde al motivo per cui il reindirizzamento dell'OP non funzionava, che era una delle domande che l'OP stava ponendo. Nessun altro si occupa di questo.
NeutronStar

come farebbe un pipe a un altro processo con questo?
Paul,

10

il tempo è incorporato nella shell e non sono sicuro che ci sia un modo per reindirizzarlo. Tuttavia puoi usare /usr/bin/timeinvece, che accetta definitivamente qualsiasi reindirizzamento dell'output.


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

4
Il tempo incorporato funziona bene con il reindirizzamento dell'output. Emette solo su STDERR, non su STDOUT.
Mnementh

Il problema è che i comandi incorporati vengono eseguiti all'interno dell'ambiente shell stesso, non in una subshell. Poiché lo stderr della tua shell è tipicamente connesso al terminale, il reindirizzamento non farà nulla. Per reindirizzare l'ora incorporata, credo che dovresti fare qualcosa di simile bash time mycmd 2>file. O semplicemente chiama /usr/bin/timecome è stato detto.
ktbiz

È inoltre possibile utilizzare il non-built-in senza specificare il percorso completo: stackoverflow.com/questions/29540540/...
Ciro Santilli郝海东冠状病六四事件法轮功

4

Se non vuoi combinare l'output di timee il comando. Con il tempo GNU, puoi usare -o filecome:

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

while timè l'output di time oute errsono stdout e stderr da grep.


4

Il motivo per cui il reindirizzamento non sembra funzionare timeè che è una parola riservata bash (non incorporata!) Quando viene utilizzata davanti a una pipeline. bash (1):

Se il tempo riservato alla parola precede una pipeline, al termine della pipeline vengono riportati il ​​tempo trascorso nonché il tempo dell'utente e del sistema consumato dalla sua esecuzione.

Quindi, per reindirizzare l'output di time, usa le parentesi graffe:

{ time ls; } 2> filename

Oppure chiama /usr/bin/time:

/usr/bin/time ls 2> filename

0

Uso il reindirizzamento del metodo stdout e stderr con parentesi graffe per il test.
Il &>>rptrappresenta questo >>rpt 2>&1ma più breve.
Le parentesi graffe eseguiranno uno o più comandi nella shell corrente. Vedi: man bash

{ time ls a*; } &>>rpt
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.