В linux все - это файл. И каждый процесс работает с файловыми дескрипторами:
0 - stdin
1 - stdout
2 - stderr
3+ - любые дополнительные
Понимание этого - ключ к нормальной автоматизации.
▪️ Базовые перенаправления
command >out.log # stdout
command 2>err.log # stderr
command >all.log 2>&1 # объединить
2>&1 значит: направь stderr туда же, куда сейчас смотрит stdout.⚠️ Порядок важен:
command 2>&1 >file - НЕ то же самое.▪️ Dup (дублирование дескрипторов). Можно создать свой поток:
exec 3>debug.log
echo "debug" >&3
Теперь 3 пишет в
debug.log.Это удобно, если нужно:
отделить debug-лог от основного вывода
не засорять stdout
вести параллельный лог
▪️ Временное перенаправление
{
echo "только в файл"
} >file.txt
Или:
exec >all_output.log 2>&1
Теперь весь скрипт пишет в лог.
▪️ Закрытие дескриптора. Иногда нужно закрыть поток:
exec 3>&-
Это освобождает дескриптор.
Полезно при работе с сокетами, FIFO и временными логами.
▪️ Практический кейс. Раздельный лог и чистый stdout:
exec 3>debug.log
BASH_XTRACEFD=3
set -x
Трассировка уйдет в файл, а stdout останется чистым для пайплайна.
BashTex 📱 #bash #utils