Ho un comando per la parola chiave bash time che non riesco a spiegare completamente, ma funziona per me.
Il mio obiettivo:
-
per trovare il tempo di esecuzione di uno script python, che prende una variabile tra l'altro, da uno script bash, e acquisire quel valore.
-
anche per acquisire l'output dello script python nella stessa variabile, per l'analisi del successo o del fallimento.
Dopo aver letto in giro ho finito con questo comando, ma non sono completamente in grado di spiegarlo.
ttime=$( (TIMEFORMAT="%U^"; time /../myscript.py ${__myvar} 2>&1 )|& tr -d f)
Puoi spiegare perché ho bisogno del secondo comando tr -d f
nella pipe, per il valore del tempo da aggiungere all'output del comando,
La scelta di 'tr -d f' è stata del tutto arbitraria e non influirà sull'output del mio script, std o err, ma senza di esso o un altro comando che agisca sull'output del testo dello script in qualche modo minore, vedo il ritorno dal python senza l'ora aggiunta, perché?
Modifica:
La vera domanda avrebbe dovuto essere perché |& tr -d f
. necessario e, come dice Stephanie, è |&che consente di passare i tempi trovati nella parola chiave sterr dalla parola chiave time nell'output della pipeline
La soluzione ora è simile a:
ttime=$(TIMEFORMAT="%U^"; { time /../myscript.py ${__myvar} ; } 2>&1 )
Esercitazione sul descrittore di campo:
http://wiki.bash-hackers.org/howto/redirection_tutorial
Risposta accettata:
In bash
, come in ksh
, time
è una parola chiave (non integrato) utilizzato per cronometrare una pipeline (non solo comando semplice, può anche cronometrare comandi composti).
Tra time cmd 2> something
, stiamo cronometrando cmd 2> something
e stampando l'output su stderr, ma sullo stderr originale.
Devi reindirizzare stderr prima il time
viene invocato il costrutto. Cosa fai con il tuo |&
che reindirizza lo stdout e lo stderr della subshell time
viene eseguito, ma un modo molto più semplice per farlo sarebbe:
time=$(TIMEFORMAT="%U^"; { time cmd; } 2>&1)
Ciò non implica una subshell (qui utilizziamo un gruppo di comandi invece) né un comando aggiuntivo.
Nota che con bash
:
time=$(time (cmd) 2>&1)
capita di lavorare per caso. Non ci farei affidamento perché potrebbe cambiare nelle versioni future e non funziona in altre shell che hanno un time
parola chiave.
Se volevi solo l'output temporale in $time
(e non stdout o stderr del comando), faresti:
{ time=$(TIMEFORMAT="%U^"; { time cmd 2>&3 3>&-; } 2>&1); } 3>&1