2012-11-01 10 views
9

ho bisogno di scrivere il tempo necessario per eseguire questo comando in un file txt:script bash scrittura esecuzione di tempo in un file

time ./program.exe 

Come posso fare in script bash?

Provo con >> time.txt ma ciò non funziona (l'output non va al file e va allo schermo).

+1

possibile duplicato del comando [Lottare per analizzare (bash) tempo] (http://stackoverflow.com/questions/3928430/struggling-to-parse-bash-time-command) –

risposta

18

Ottenere time in bash per scrivere su un file è un lavoro duro. È un comando integrato bash. (In Mac OS X, c'è un comando esterno, /usr/bin/time, che fa un lavoro simile, ma con un formato di output diverso e meno riluttanza.)

È necessario utilizzare:

(time ./program.exe) 2> time.txt 

Scrive sullo standard error (da cui la notazione 2>). Tuttavia, se non si utilizza la sub-shell (le parentesi), non funziona; l'output arriva ancora sullo schermo.


alternativa, e senza un sub-shell, è possibile utilizzare:

{ time ./program.exe; } 2> time.txt 

Nota lo spazio dopo la parentesi aperta e il semi-colon; entrambi sono necessari su una singola riga. Le parentesi devono apparire dove può apparire un comando e devono essere simboli indipendenti. (Se si lotta abbastanza, si arriva con ...;}|something o ...;}2>&1. Entrambi identificano il tutore come un simbolo autonomo, tuttavia. Se si prova ...;}xyz, la shell (probabilmente) non riuscirà a trovare un comando chiamato }xyz, sebbene .)


I need to run more command in more terminal. If I do this:

xterm -xrm '*hold: true' -e (time ./Program.exe) >> time.exe & sleep 2 

it doesn't work and tells me Syntax error: "(" unexpected . How do I fix this?

Lei avrebbe bisogno di fare qualcosa di simile:

xterm -xrm '*hold: true' -e sh -c "(time ./Program.exe) 2> time.txt & sleep 2" 

il cambiamento chiave è quello di eseguire la shell con lo script proveniente dal argomento dell'opzione -c; è possibile sostituire sh con /bin/bash o un nome equivalente. Questo dovrebbe aggirare qualsiasi problema di "Errore di sintassi". Non sono abbastanza sicuro di ciò che scateni quell'errore, quindi potrebbe esserci un modo più semplice e migliore per affrontarlo. E 'anche possibile che l'opzione xterm s' -e richiede solo un singolo argomento stringa, nel qual caso, suppongo che devi usare:

xterm -xrm '*hold: true' -e 'sh -c "(time ./Program.exe) 2> time.txt & sleep 2"' 

Puoi bash manuale xterm così come posso.

Non sono sicuro del motivo per cui si esegue il programma a tempo in modalità background, ma questo è il tuo problema, non il mio. Analogamente, lo sleep 2 non è ovviamente necessario se lo hold: true mantiene aperto il terminale.

+0

Ho bisogno di eseguire più comandi in più terminale. Se lo faccio, xterm -xrm '* tieni: true' -e (time ./Program.exe) 2> time.exe e sleep 2 non funziona e dimmi Errore di sintassi: "(" imprevisto – NikM

0

Non è facile reindirizzare l'output della bash integrata time.

Una soluzione è quella di utilizzare il programma esterno time:

/bin/time --append -o time.txt ./program.exe 

(sulla maggior parte dei sistemi è un programma GNU, in modo da utilizzare info time piuttosto che man per ottenere la documentazione).

+0

Nota: questo non funziona con le funzioni di bash L'argomento su GNU 'time' deve essere un comando disponibile nel tuo percorso. – tjameson

0

time_elapsed = (time sh -c "./program.exe") 2>&1 | grep "real" | awk '{print $(NF)}' eco time_elapsed> file.txt Questo comando dovrebbe darvi l'ora esatta consumato in bash in un file desiderato ..

È inoltre possibile reindirizzare a un file di USNG 2> file.txt come spiegato in un'altra risposta.

0

Basta racchiudere il comando in volta in un { .. }:

{ time ./program.exe; } 2>&1 

Naturalmente, l'uscita del tempo incorporato va a stderr, così il reindirizzamento necessaria 2>&1.

Poi, può sembrare difficile da catturare l'output, usiamo un secondo { .. } per leggere il comando più facilmente, questo funziona:

{ { time ./program.exe; } 2>&1; } >> time.txt    # This works. 

Tuttavia, il costrutto corretta dovrebbe semplicemente la cattura invertito , come questo:

{ time ./program.exe; } >> time.txt 2>&1;     # Correct. 

per chiudere qualsiasi uscita possibile dal comando, reindirizzare il suo output a/dev/null, poiché:

{ time ./program.exe >/dev/null 2>&1; } >> time.txt 2>&1 # Better. 

E, come ora c'è solo l'uscita su stderr, potremmo semplicemente catturare proprio questo:

{ time ./program.exe >/dev/null 2>&1; } 2>> time.txt  # Best. 

L'output ./program dovrebbe essere reindirizzato, o può anche finire dentro time.txt.

Problemi correlati