rc=$(...)
signifie que le code de retour sera tout ce qui est imprimé sur le descripteur de fichier (fd) 1
par le code dans le (...)
. Donc, en quelque sorte, ce somescript.sh
sorties doit être retiré fd 1
, puis ramené plus tard. La ligne echo
renvoie le code retour somescript.sh
à fd 3
. Ensuite, 3>&1
envoie le code de retour enregistré à fd 1
, où $(...)
l'attend. Cependant, cela signifie que le vieux fd 1
(de {somescript 2>&1 } | tee
) n'a nulle part où aller. Donc l'ancien fd 1
est redirigé vers fd 4
avec >&4
(et le côté d'entrée est fermé avec 4>&-
car il ne sera pas utilisé). Ensuite, une fois que le $(...)
est terminé, le 4>&1
à la fin met la sortie du somescript|tee
sur fd 1
où d'autres programmes s'attendent à ce qu'il soit.
Ouf!
Sans >&4
, la sortie de somescript.sh
et la sortie de echo "$?"
seraient mélangés sur fd 1
en raison de la 3>&1
. Donc fd 4
est un stylo d'attente pour la sortie réelle de somescript.sh
pendant le temps que fd 1
est utilisé pour transporter le code de retour.
J'ai toujours pensé que $ (...) se lisait à partir de stdout, ce que fd 1 pointe généralement aussi, mais si cela se lit à partir de fd 1, cela aurait beaucoup de sens. Merci. – dood
fd 1 ne "pointe" pas sur la sortie standard; il * est * sortie standard. – chepner
@chepner ah ok, merci pour la clarification, et normalement stdout points au terminal alors. – dood