exec e tee nel file di log: spiega questi comandi bash


15

Ho visto questo nella parte superiore del mio file di script bash:

export LOGFILE=$LOGDIRECTORY/${SCRIPT_NAME}.log
exec > >(tee $LOGFILE)
exec 2>&1

Che cosa fa? Cosa ci fanno due processi exec qui? Mi rendo conto che mantenendolo così, tutto l'output dell'esecuzione della sceneggiatura viene convogliato $LOGFILEma volevo capire dal punto di vista delle execaffermazioni.



1
Hai visto questo nella parte superiore del tuo file di script bash? ;)
Sebb,

1
Le due execlinee potrebbero perfettamente essere solo una ( exec > >(tee "$LOGFILE") 2>&1).
Jonathan Leffler,

Risposte:


18

Nelle shell, execfa 1) aperture e reindirizzamenti di file 2) effettiviexec ing (sostituendo l'immagine di processo corrente con un'altra immagine di processo).

Questi exec sono reindirizzamenti.

Per prima cosa reindirizzare ( exec 1> >(tee $LOGFILE)) il stdoutdescrittore (1) a una pipe generata dalla sostituzione del processo connessa a un teeprocesso eseguito contemporaneamente che ha $LOGFILEcome primo argomento e quindi reindirizzare il stderrdescrittore (2) nella stessa posizione in cui il descrittore1 ora punta il (il tee tubo).

Tenendo presente che i filedescriptor vengono ereditati, hai appena fatto in modo che tutto il futuro stdoute l' stderroutput vadano nel teeprocesso, che lo scrive in $LOGFILEe ovunque il filedescriptor 1 indicasse in origine (probabilmente il tuo terminale).


Nota: il processo tee restituisce lo stdout originale (= l'originale filedescriptor 1) perché, come puoi imparare da / cercando bash (1) per l' espansione dei comandi semplici e la sostituzione dei processi , la sostituzione dei processi ( >() <()) avviene (insieme ad altre espansioni) prima i reindirizzamenti vengono eseguiti, il che significa che il reindirizzamento exec 1> >(tee "$LOGFILE")avviene dopo l' tee avvio, lasciando teecon lo stesso filedescriptor 1 che ha ereditato dalla shell padre. (Se fosse il contrario, teeverrebbe fatto scrivere sul proprio input, il che potrebbe renderlo deadlock, a seconda del suo schema IO).

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.