Сопроцессы (coproc)
Тема дорожной карты · Bash
Сопроцесс Bash, запускаемый синтаксисом coproc NAME { command; }, выполняет фоновую команду, подключая её стандартный ввод и вывод к дескрипторам файлов родительской оболочки, что обеспечивает истинное двунаправленное взаимодействие между Bash-скриптом и долго работающим подпроцессом. В отличие от простых конвейеров, сопроцесс в shell-скриптах позволяет родительскому Bash-скрипту писать в ${NAME[1]} и читать из ${NAME[0]} интерактивно в ходе нескольких обменов — это полезно для управления интерактивными инструментами, такими как bc, CLI баз данных или пользовательские демоны из скрипта автоматизации Linux. PID сопроцесса доступен через $NAME_PID, что позволяет использовать wait для ожидания его завершения или отправлять ему сигналы по окончании рабочего процесса. Сопроцессы являются продвинутой функцией Bash, недоступной в POSIX sh, введённой в Bash 4.0, и должны использоваться тогда, когда подстановки процессов или простые каналы недостаточны для требуемой интерактивности. Понимание сопроцессов предоставляет инженерам Bash-скриптов мощный инструмент для организации сложных рабочих процессов командной строки Linux, требующих состоятельных, диалоговых подпроцессов.
Как это работает
Сопроцессы (coproc): фоновые задания (cmd &, wait), job control (jobs, fg, bg), command substitution ($(cmd) — современный, `cmd` — legacy), арифметика ($((expr)), (( ))), brace expansion ({1..10}, {a,b,c}), trap-сигналы (trap "..." SIGINT SIGTERM), coproc (coproc cmd { ... } для двунаправленных пайпов), exec (exec cmd заменяет shell).
Когда применять
& + wait — для параллелизации независимых медленных операций (multi-host SSH, batch-загрузки). $() лучше backticks (чище, вкладываемы). trap "cleanup" SIGINT SIGTERM EXIT — для graceful shutdown. Coproc — редко; его особенности нишевые.
Типичные ошибки
Ловушки Сопроцессы (coproc): фоновый запуск без wait (скрипт выходит, jobs убиты); арифметика через expr (медленно, legacy — используйте $(( ))); brace expansion в скриптах для POSIX-совместимости (это bash-расширение); долгие фоновые jobs держат терминал (disown или nohup).