В оболочках: 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было бы сделано для записи в его собственный ввод, который мог бы сделать это тупиком, в зависимости от его шаблона ввода-вывода).