exec: FD 3, 4, логирование и контроль потоковВ Bash обычно работают только с stdin (0), stdout (1) и stderr (2). Но файловые дескрипторы на этом не заканчиваются - можно использовать FD 3, 4 и выше для более гибкого управления потоками.
▪️Базовая идея
Каждый процесс имеет таблицу файловых дескрипторов:
0 → stdin
1 → stdout
2 → stderr
Но можно открыть дополнительные:exec 3>debug.log
Теперь FD 3 пишет в файл debug.log.▪️Разделение логов
Классический приём - разделить обычный вывод и отладку:
echo "normal output"
echo "debug info" >&3
Результат:stdout остаётся чистым
debug уходит в отдельный файл
▪️Перенаправление команд через FD
Можно связать вывод команды с кастомным дескриптором:
exec 4< input.txt
Теперь FD 4 читает файл как поток.Чтение:
read -u 4 line
echo "$line"
▪️Логирование через единый каналУдобный паттерн - централизованный лог:
exec 3>>/var/log/myapp.log
log() {
echo "$(date '+%F %T') $*" >&3
}
Теперь все логи идут через FD 3, без захламления stdout.▪️Почему это лучше обычного >> везде
единая точка управления логированием
проще отключать/перенаправлять вывод
можно динамически менять файл логов через
exec▪️Закрытие дескрипторов
exec 3>&-
FD освобождается, файл больше не удерживается процессом.▪️Где это реально используется
сложные Bash-скрипты с несколькими потоками данных
системы логирования без внешних библиотек
обработка нескольких входных источников одновременно
изоляция debug/production вывода
FD выше 2 - это недооценённый инструмент, который превращает Bash из набора команд в полноценную систему управления потоками.
BashTex 📱 #scripts #linux