В bash обычно все сводится к pipe: команда - команда. Но классический пайп односторонний. Если нужен диалог с процессом в обе стороны - используется coproc.
▪️ Что такое coproc. Он запускает процесс и даёт два канала:
stdin - в процесс
stdout - из процесса
И все это без временных файлов и костылей с FIFO.
▪️ Базовый пример
coproc BC { bc -l; }
Теперь у нас есть процесс калькулятора, с которым можно общаться.
Отправляем данные:
echo "2+2" >&"${BC[1]}"
read result <&"${BC[0]}"
echo "$result"
▪️ Как это устроено. После запуска bash создает массив:
${COPROC[0]} # stdout процесса
${COPROC[1]} # stdin процесса
Можно читать и писать независимо.
▪️ Реальный кейс: фоновый parser
coproc JSON { jq -c '.name'; }
Отправляем поток данных:
echo '{"name":"test"}' >&"${JSON[1]}"
read out <&"${JSON[0]}"
echo "$out"
▪️ Почему это лучше pipe Pipe работает так:
cmd1 | cmd2
Но:
• нет обратного канала
• процесс заканчивается сразу
• нельзя поддерживать состояние
coproc позволяет держать живой процесс и общаться с ним как с сервисом.
▪️ Важный момент. Процесс внутри coproc не перезапускается автоматически. Если он завершился - каналы перестают работать, и это нужно проверять вручную.
▪️ Где это реально полезно
• интерактивные CLI-инструменты (bc, python, sqlite3)
• долгоживущие парсеры (jq, awk, кастомные демоны)
• проксирование данных между процессами
• построение "мини-сервисов" прямо в Bash
coproc превращает bash из набора команд в примитивную систему IPC, где процессы начинают вести диалог, а не просто передавать поток данных в одну сторону.
BashTex 📱 #bash #scripts