exec і tee до логфайлу: поясніть ці команди bash


15

Я бачив це у верхній частині мого файлу скриптів bash:

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

Що це робить? Які два виконавчі процеси тут роблять? Я усвідомлюю, що зберігаючи його таким чином, весь результат виконання сценарію є перекладеним, $LOGFILEале я хотів зрозуміти з точки зору execтверджень.


Це могло б дати зрозуміти: linuxjournal.com/content/bash-redirections-using-exec
coffeMug

1
Ви бачили це у верхній частині вашого файлу сценарію баш? ;)
Себб

1
Ці два execрядки цілком могли бути лише одним ( exec > >(tee "$LOGFILE") 2>&1).
Джонатан Леффлер

Відповіді:


18

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.