exec et tee dans le fichier journal: expliquez ces commandes bash

15

Je l'ai vu en haut de mon fichier de script bash:

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

Qu'est ce que ça fait? Que font deux processus exécutables ici? Je me rends compte qu'en le gardant comme ça, toutes les sorties de l'exécution du script sont canalisées $LOGFILEmais je voulais comprendre du point de vue des execdéclarations.

Senthil Kumaran
la source
Cela pourrait être clair: linuxjournal.com/content/bash-redirections-using-exec
coffeMug
1
Vous l'avez vu en haut de votre fichier de script bash? ;)
Sebb
1
Les deux execlignes pourraient parfaitement être une seule ( exec > >(tee "$LOGFILE") 2>&1).
Jonathan Leffler

Réponses:

18

Dans les shells, exec1) ouvre-t-il et réoriente-t-il les fichiers? 2) execing réel (en remplaçant l'image de processus actuelle par une autre image de processus).

Ce execsont des redirections.

D'abord, vous redirigez ( exec 1> >(tee $LOGFILE)) le stdoutdescripteur (1) vers un tube généré par substitution de processus connecté à un teeprocessus exécuté simultanément qui a $LOGFILEcomme premier argument, puis vous redirigez le stderrdescripteur (2) au même endroit que celui où le descripteur 1pointe maintenant (le tee tuyau).

En gardant à l'esprit que les filedescripteurs sont hérités, vous venez de faire en sorte que tous les futurs stdoutet les stderrsorties soient envoyés au teeprocessus, qui les écrit $LOGFILEet où les filedescriptor 1 pointaient à l'origine (probablement votre terminal).


Remarque: le processus de sortie sort vers la sortie standard (= le descripteur de fichier d'origine 1) car, comme vous pouvez l'apprendre de / en recherchant bash (1) pour l' extension de commande simple et la substitution de processus, la substitution de processus ( >() <()) se produit (avec d'autres extensions) avant les redirections sont exécutées, ce qui signifie que la redirection exec 1> >(tee "$LOGFILE")se produit après le tee démarrage, laissant teele même descripteur de fichier 1 qu'il a hérité du shell parent. (Si c'était l'inverse, il teeserait fait d'écrire sur sa propre entrée, ce qui pourrait le bloquer, selon son modèle d'E / S).

PSkocik
la source