coproc - один из недооценённых инструментов в Bash. Он позволяет создавать фоновые процессы с доступом к их вводу/выводу через переменные. То есть, ты получаешь легкий способ запускать команды асинхронно и при этом взаимодействовать с ними.🌟 Зачем нужен coproc?
Иногда тебе нужно запустить процесс в фоне, при этом:
1. Посылать ему данные (stdin)
2. Читать от него результат (stdout)
3. Не колхозить с mkfifo, & и exec
Вот тут и заходит coproc.
▪️ Синтаксис
coproc ИМЯ { команда; }
После этого у тебя появятся:
${ИМЯ[0]} - дескриптор для чтения (stdout команды)${ИМЯ[1]} - дескриптор для записи (stdin команды)▪️ Пример 1: диалог с bc
coproc CALC { bc -l; }
echo "2^10" >&"${CALC[1]}"
read -r result <&"${CALC[0]}"
echo "Результат: $result"
bc запустился в фоне, мы отправили ему выражение, получили результат - красиво, без лишних файлов и форков.
▪️ Пример 2: интерактивный grep
coproc GREPPER { grep --line-buffered "error"; }
# Пишем в grep
echo "all ok" >&"${GREPPER[1]}"
echo "fatal error!" >&"${GREPPER[1]}"
# Читаем вывод (будет только строка с error)
read -r matched <&"${GREPPER[0]}"
echo "Найдено: $matched"
▪️ Пример 3: асинхронная обработка большого файла
coproc SORTER { sort > sorted.txt; }
# Пишем данные на сортировку
cat bigfile.csv >&"${SORTER[1]}"
# Ждём завершения
wait "${SORTER_PID}"
echo "Готово!"
BashTex 📱 #bash #utils