Сопроцессоры
Со-процессор(coproc) - это процесс, который выполняется параллельно с оболочкой и с которым может взаимодействовать оболочка. Оболочка запускает процесс в фоновом режиме и управлется он с помощью двух каналов: один для отправки данных в со-процесс, второй для получения из со-процесса.
Для выполнения сопроцесса существуют два синтаксиса:
```shell
coproc name non-simple command # Start a named coprocess
coproc command args #Start an unnamed coprocess
```
Оболочка создает переменную массив `name`, чтобы хранить файловые дескрипторы для связи с со-процессом.
`name[0]` - это файловый дескриптор канала подключенного к стандартному выводу со-процесса (вход для управляющей оболочки), а name [1] - подключен к стандартному вводу со-процесса (вывод из оболочки).
Кроме того, переменная `name_PID` содержит идентификатор процесса сопроцесса.
Если имя не указано, оболочка использует `COPROC`.
Например:
```shell
coproc testproc (echo 1; read line; echo $line) #Запускаем со-процесс с именем testproc в фоновом режиме
echo ${testproc[@]} # Выводим файловые дескрипторы
#62 58
echo $testproc_PID # PID со-процесса
#18013
read out <&${testproc[0]} # Прочитайть первую строку сопроцесса и показать её
echo $out
#1
echo "Hello world" >&${testproc[1]} # Отправить со-процессу какой-нибудь ввод
read out2 <&${testproc[0]} # Чтение второй строки вывода
#[2]+ Готово coproc testproc ( echo 1; read line; echo $line )
echo $out2 # Показать вторую строку вывода
#Hello world
```