Ввод/вывод
Тема дорожной карты · Bash
Перенаправление ввода/вывода в Bash управляет тем, откуда команды читают ввод и куда отправляют вывод: > перенаправляет stdout в файл (перезаписывая его), >> добавляет в конец файла, 2> перенаправляет stderr, 2>&1 объединяет stderr со stdout, а < file предоставляет файл как stdin — все это основные примитивы shell-скриптов для автоматизации Linux. Шаблон command > /dev/null 2>&1 подавляет весь вывод команды, а command >> logfile 2>&1 добавляет как stdout, так и stderr в лог-файл — две идиомы, постоянно используемые в скриптах cron и фоновой автоматизации в командной строке. Bash 4.0+ поддерживает объединённые перенаправления &> и &>> как сокращение для > file 2>&1 и >> file 2>&1, уменьшая многословность в современных shell-скриптах. Дескрипторы файлов помимо 0, 1 и 2 можно открывать с помощью exec 3>output.txt, записывать в них через echo "data" >&3 и закрывать через exec 3>&- — что позволяет реализовывать расширенные шаблоны ввода/вывода, например одновременное журналирование в несколько назначений в скриптах автоматизации Linux. Глубокое понимание перенаправления ввода/вывода необходимо для написания Bash-скриптов, поскольку оно определяет, как данные передаются между командами, файлами и терминалом в каждом конвейере и задаче автоматизации.
Как это работает
Ввод/вывод: > пишет (truncate), >> дописывает, < читает stdin из файла, 2> редиректит stderr, 2>&1 мержит stderr в stdout, &> редиректит оба (bash-расширение). Heredocs: <<EOF ... EOF (var-expanded), <<'EOF' ... EOF (literal). Here-strings: <<< (строка в stdin). Process substitution: <(cmd) и >(cmd) делают fifo-like файл. Tee делит вывод: cmd | tee file.
Когда применять
cmd 2>&1 | tee log.txt — увидеть + сохранить полный вывод. Heredocs — для multi-line строк/скриптов. cmd > out 2> err — захват stdout + stderr раздельно. Process substitution (diff <(cmd1) <(cmd2)) — для избежания temp-файлов, когда команды берут файлы как input.
Типичные ошибки
Ловушки Ввод/вывод: cmd > file 2>&1 vs cmd 2>&1 > file (порядок важен — первый открывает файл и для stderr, второй шлёт stderr туда, куда stdout был ДО редиректа); случайный clobber важного файла через > (используйте set -o noclobber и >| для override); >> к файлу, которым не владеете (silent fail в restricted-директориях).