exec и tee в лог-файл: объясните эти команды bash

15

Я видел это в верхней части моего файла сценария bash:

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

Что оно делает? Что здесь делают два exec-процесса? Я понимаю, что, сохраняя это таким образом, все результаты выполнения скрипта передаются по конвейеру, $LOGFILEно я хотел понять это с точки зрения execутверждений.

Сентил Кумаран
источник
Это может сделать это ясно: linuxjournal.com/content/bash-redirections-using-exec
coffeMug
1
Вы видели это в верхней части вашего файла сценария bash? ;)
Себб
1
Две execстроки вполне могут быть просто одна ( exec > >(tee "$LOGFILE") 2>&1).
Джонатан Леффлер

Ответы:

18

В оболочках: exec1) открытия и перенаправления файлов; 2) актуальное exec(замена текущего образа процесса другим образом процесса).

Это execперенаправления.

Сначала вы перенаправляете ( exec 1> >(tee $LOGFILE)) stdoutдескриптор (1) к каналу, генерируемому подстановкой процесса, подключенному к параллельно выполняемому teeпроцессу, который имеет в $LOGFILEкачестве первого аргумента, а затем вы перенаправляете stderrдескриптор (2) в то же место, куда 1сейчас указывает дескриптор (тройник труба).

Помня о том, что файловые дескрипторы наследуются, вы только что сделали все будущее stdoutи stderrвыходные данные отправлены в teeпроцесс, который записывает его $LOGFILEи туда, куда изначально указывал файловый дескриптор 1 (возможно, ваш терминал).


Примечание: процесс тройника выводится в исходный стандартный вывод (= исходный дескриптор файла 1), потому что, как вы можете узнать из / search bash (1) для простого расширения команды и замены процесса, подстановка процесса ( >() <()) происходит (вместе с другими расширениями) перед перенаправления выполняются, что означает, что перенаправление exec 1> >(tee "$LOGFILE")происходит после tee запуска, оставляя teeс тем же файловым дескриптором 1, который он унаследовал от родительской оболочки. (Если бы это было наоборот, teeбыло бы сделано для записи в его собственный ввод, который мог бы сделать это тупиком, в зависимости от его шаблона ввода-вывода).

PSkocik
источник