TGViewer
BashTex | Linux BashTex | Linux @bash_tex · 2.51K subscribers
Post #669 177
coproc: как Bash общается с фоновым процессом в обе стороны

Обычно Bash запускает фоновый процесс через &, но передавать ему команды и получать ответы уже сложнее.

Можно использовать временные файлы или именованные каналы, а можно обойтись встроенным coproc.

Он запускает процесс в фоне и создаёт два канала: один для записи в его stdin, другой для чтения stdout.

▪️Запускаем фоновый процесс

Например, создадим простой обработчик строк:

coproc WORKER {
while IFS= read -r line; do
printf 'Processed: %s\n' "$line"
done
}


Bash создаст массив WORKER с двумя файловыми дескрипторами:

WORKER[0] # читаем stdout процесса
WORKER[1] # пишем в stdin процесса


При этом основной скрипт продолжит выполняться.

▪️Передаём данные и получаем ответ

Отправим строку обработчику:

printf 'hello\n' >&"${WORKER[1]}"


Теперь прочитаем результат:

IFS= read -r result <&"${WORKER[0]}"
echo "$result"


Получим:

Processed: hello


Процесс не пришлось запускать повторно. Он продолжает работать и ждать следующие строки.

▪️Зачем это нужно

Представим, что скрипт должен отправить тысячу запросов одной программе.

При обычном подходе:

for item in "${items[@]}"; do
processor "$item"
done


Программа запускается заново для каждого элемента.

С coproc можно один раз запустить обработчик, передавать ему данные и читать ответы через открытые каналы.

Это особенно полезно, если запуск программы дорогой или она поддерживает постоянный обмен сообщениями через stdin/stdout.

▪️Есть важный нюанс

Не каждая программа сразу отправляет данные в stdout. Некоторые буферизуют вывод, когда он подключён к каналу, а не к терминалу.

В таком случае read может ждать ответ, хотя программа уже обработала запрос.

Ещё одна особенность: дескрипторы coproc не всегда доступны командам, запущенным как отдельные дочерние процессы. Для таких сценариев их можно предварительно продублировать через exec.

▪️Как завершить работу

Закрываем канал записи и ждём завершения обработчика:

exec {WORKER[1]}>&-
wait "$WORKER_PID"


После EOF цикл внутри обработчика завершится самостоятельно.
coproc удобен, когда нужен постоянный двусторонний обмен с процессом без сокетов, временных файлов и повторных запусков программы.

BashTex 📱 #bash #linux
  • 👍 3
  • 🔥 2
More from @bash_tex
  1. Oct 15, 2026fsync() vs fdatasync(): когда данные действительно попадают на диск Программа записала дан…
  2. Oct 13, 2026openat2(): как Linux защищает от выхода за пределы каталога Допустим, приложение должно чи…
  3. Oct 12, 2026xargs против while read: где быстрее и безопаснее Обе конструкции позволяют обработать спи…
  4. Oct 9, 2026BashTex 📱 #мем
  5. Oct 8, 2026Bridge FDB - как Linux bridge узнаёт, где находится MAC Linux bridge не знает заранее, за…
  6. Oct 7, 2026/dev/tcp - сетевое соединение средствами Bash В Bash есть малоизвестная возможность работа…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →