GNU/Linux >> Linux Esercitazione >  >> Linux

Risultato della parola chiave Bash Time solo con il secondo comando convogliato, spiega perché?

Ho un comando per la parola chiave bash time che non riesco a spiegare completamente, ma funziona per me.

Il mio obiettivo:

  1. 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.

  2. 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

Linux
  1. Pianifica un'attività con il comando Linux at

  2. Comandi accoppiati con operatori di controllo in Bash

  3. Tutorial sui comandi dell'ora di Linux per principianti (con esempi)

  4. Lo script Bash con `set -e` non si ferma al comando `… &&…`?

  5. Perché impostare una variabile prima di un comando è legale in Bash?

Bash HereDoc Tutorial con esempi

Come eseguire un comando con limite di tempo (timeout) in Linux

Comando Bash Echo spiegato con esempi in Linux

Scripting Bash – Spiegazione del comando Printf con esempi

Tracciare il tempo con Timewarrior alla riga di comando

Esegui comandi con un limite di tempo in Ubuntu 20.04