# === 1. ВЫВОД (STDOUT / STDERR) ===command > file # stdout => file (перезапись)command >> file # stdout => file (добавление)command 2> file # stderr => file (перезапись)command 2>> file # stderr => file (добавление)command &> file # bash: stdout+stderr => file (перезапись)command &>> file # bash: stdout+stderr => file (добавление)command > file 2>&1 # stdout => file, stderr => туда же (универсально для sh/bash)# === 2. ВВОД (STDIN) ===command < file # stdin <= filecommand <<EOF # here-doc: stdin <= строки до EOF (с подстановкой $переменных)... текст, $USER ...EOFcommand <<'EOF' # here-doc без подстановки переменных (кавычки отключают $)$USER останется как $USEREOFcommand <<-EOF # here-doc: удаляет начальные ТАБЫ (удобно для отступов в скриптах) строка с отступом табомEOFcommand <<< "text" # here-string: stdin <= "text\n"# === 3. ИГНОРИРОВАНИЕ ВЫВОДА ===command > /dev/null # отбросить stdoutcommand 2> /dev/null # отбросить stderrcommand &> /dev/null # отбросить оба потока (bash)command > /dev/null 2>&1 # отбросить оба потока (универсально)# === 4. ГРУППИРОВКА КОМАНД ==={ cmd1; cmd2; } > file # группа в ТЕКУЩЕМ shell (обязательны пробелы и ';' в конце!)( cmd1; cmd2 ) > file # группа в SUBSHELL (изолированное окружение)# === 5. ДЕСКРИПТОРЫ И УПРАВЛЕНИЕ СЕССИЕЙ (EXEC) ===exec > file 2>&1 # перенаправить stdout+stderr ВСЕГО текущего shell/скриптаexec 3> log # открыть log как FD 3 на записьecho "msg" >&3 # писать в FD 3exec 3>&- # закрыть FD 3 (полезно закрывать за собой!)# === 6. КОНВЕЙЕРЫ (PIPES) ===command 2>&1 | other # объединить stdout+stderr и направить в stdin 'other'command |& other # bash: то же самое (сокращение)# === 7. ПОДСТАНОВКА ПРОЦЕССОВ (PROCESS SUBSTITUTION) ===diff <(cmd1) <(cmd2) # чтение: вывод команд оформляется как временные файлыcommand | tee >(cmd1) >(cmd2) # запись: разветвление вывода в несколько команд
Чуть объяснений
= 1. ВЫВОД (STDOUT / STDERR) =
command > file # Очищает file и пишет туда то, что команда вывела бы на экранcommand >> file # Не удаляет старое, а ДОПИСЫВАЕТ новый вывод в конец filecommand 2> file # Пишет в file ТОЛЬКО ошибки (сообщения об ошибках)command 2>> file # ДОПИСЫВАЕТ только ошибки в конец filecommand &> file # (Bash) Пишет И обычный вывод, И ошибки в один file (перезапись)command &>> file # (Bash) ДОПИСЫВАЕТ и обычный вывод, и ошибки в filecommand > file 2>&1 # (Стандарт) Сначала направил вывод в file, а потом ошибки туда же
= 2. ВВОД (STDIN) =
command < file # Заставляет команду читать данные ИЗ файла, а не ждать ввода с клавиатурыcommand <<EOF # Ввод прямо из терминала: передаёт всё, что ты пишешь, пока не встретит слово EOF... текст, $USER ... # ($USER превратится в твоё имя)EOFcommand <<'EOF' # Всё то же самое, но кавычки отключают подстановку$USER останется как $USER # ($USER останется просто текстом "$USER")EOFcommand <<-EOF # То же самое, но игнорирует табуляцию в начале строк (удобно для красивых отступов в коде) строка с отступомEOFcommand <<< "text" # Вбрасывает одну строку "text" на вход команде (быстрее, чем echo "text" | ...)
= 3. ИГНОРИРОВАНИЕ ВЫВОДА =
command > /dev/null # Прячет обычный вывод (выкидывает в виртуальное «ведро»)command 2> /dev/null # Прячет только ошибки (чтобы не засорять экран)command &> /dev/null # (Bash) Полная тишина: выкидывает ВСЁ (и вывод, и ошибки)command > /dev/null 2>&1 # (Стандарт) Полная тишина для любых командных оболочек
= 4. ГРУППИРОВКА КОМАНД =
{ cmd1; cmd2; } > file # Запускает команды по очереди в текущем терминале и пишет их ВСЕХ общий вывод в file( cmd1; cmd2 ) > file # Создает изолированную «песочницу» (subshell), выполняет там команды и пишет вывод в file
= 5. ДЕСКРИПТОРЫ И УПРАВЛЕНИЕ СЕССИЕЙ (EXEC) =
exec > file 2>&1 # Переключатель: отныне ВСЕ следующие команды в скрипте будут писать в file вместо экранаexec 3> log # Создает твой личный виртуальный канал №3, привязанный к файлу logecho "msg" >&3 # Шлёт строку "msg" напрямую в твой канал №3 (а значит, в log)exec 3>&- # Закрывает канал №3 (убирает за собой мусор)
= 6. КОНВЕЙЕРЫ (PIPES) =
command 2>&1 | other # Берёт И обычный вывод, И ошибки первой команды и отправляет на вход второйcommand |& other # (Bash) То же самое, но записано в 2 раза короче
= 7. ПОДСТАНОВКА ПРОЦЕССОВ (PROCESS SUBSTITUTION) =
diff <(cmd1) <(cmd2) # Запускает cmd1 и cmd2 и подсовывает их результаты в diff так, будто это два готовых файла на дискеcommand | tee >(cmd1) >(cmd2) # Берёт вывод первой команды и отправляет его КОПИИ одновремен