У оболонках exec
робиться 1) відкриття та переадресація файлів 2) фактичне використання exec
(заміна поточного зображення процесу на інше зображення процесу).
Це exec
перенаправлення.
Спочатку ви переспрямовуєте ( exec 1> >(tee $LOGFILE)
) stdout
дескриптор (1) на процес, створений заміною, підключений до одночасно запущеного tee
процесу, який є $LOGFILE
його першим аргументом, а потім ви перенаправляєте stderr
дескриптор (2) на те саме місце, де 1
зараз вказує дескриптор (трійник) труба).
Маючи на увазі, що fileescriptors дістаються у спадщину, ви просто зробили все майбутнє stdout
і stderr
вихід виходите на tee
процес, який записує його $LOGFILE
і туди, куди вказував первинний сценарій 1 (можливо, ваш термінал).
Примітка:
процес трійника виводиться на вихідний stdout (= оригінальний fileescriptor 1), тому що, як ви можете дізнатися з / пошуку bash (1) для простого розширення команд та заміщення процесу, підміна процесу ( >()
<()
) відбувається (разом з іншими розширеннями) до переадресації виконуються, а це означає, що перенаправлення exec 1> >(tee "$LOGFILE")
відбувається після того, tee
як почалося, залишаючи tee
з тим самим fileescriptor 1, що він успадкував від батьківської оболонки. (Якби було навпаки, tee
було б зроблено записувати на власний вклад, що може зробити його тупиком, залежно від його схеми вводу-виводу).