Process substitution

Тема дорожной карты · Bash

Подстановка процессов — функция Bash, позволяющая обращаться с выводом команды так, как если бы он был файлом, используя синтаксис <(command) для подстановки ввода или >(command) для подстановки вывода. Это особенно полезно в shell-скриптах, когда команда требует аргумент-файл, но нужно передать поток — например, diff <(sort file1.txt) <(sort file2.txt) сравнивает два файла после сортировки без создания временных файлов на диске. Подстановка процессов работает путём создания именованного канала или дескриптора файла в /dev/fd/, а Bash передаёт этот путь как строку охватывающей команде, делая её бесшовной и эффективной техникой автоматизации Linux. В отличие от дочернего процесса, запущенного через $(), подстановка процессов выполняется асинхронно, а подставленный процесс работает параллельно с родительским, что может увеличить пропускную способность в сложных конвейерах Bash. Поскольку подстановка процессов является Bash-специфичным расширением и не входит в стандарт POSIX, это следует учитывать в практиках написания переносимых shell-скриптов.

Как это работает

Process substitution: > пишет (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.

Типичные ошибки

Ловушки Process substitution: cmd > file 2>&1 vs cmd 2>&1 > file (порядок важен — первый открывает файл и для stderr, второй шлёт stderr туда, куда stdout был ДО редиректа); случайный clobber важного файла через > (используйте set -o noclobber и >| для override); >> к файлу, которым не владеете (silent fail в restricted-директориях).

Связанные понятия

Полезные ресурсы