У оболонках 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було б зроблено записувати на власний вклад, що може зробити його тупиком, залежно від його схеми вводу-виводу).