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.