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 $LOGFILE
mais je voulais comprendre du point de vue des exec
déclarations.
exec
lignes pourraient parfaitement être une seule (exec > >(tee "$LOGFILE") 2>&1
).Réponses:
Dans les shells,
exec
1) ouvre-t-il et réoriente-t-il les fichiers? 2)exec
ing réel (en remplaçant l'image de processus actuelle par une autre image de processus).Ce
exec
sont des redirections.D'abord, vous redirigez (
exec 1> >(tee $LOGFILE)
) lestdout
descripteur (1) vers un tube généré par substitution de processus connecté à untee
processus exécuté simultanément qui a$LOGFILE
comme premier argument, puis vous redirigez lestderr
descripteur (2) au même endroit que celui où le descripteur1
pointe 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
stdout
et lesstderr
sorties soient envoyés autee
processus, qui les écrit$LOGFILE
et 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 redirectionexec 1> >(tee "$LOGFILE")
se produit après letee
démarrage, laissanttee
le même descripteur de fichier 1 qu'il a hérité du shell parent. (Si c'était l'inverse, iltee
serait fait d'écrire sur sa propre entrée, ce qui pourrait le bloquer, selon son modèle d'E / S).la source