coproc utility não é o mesmo que utility & em bash .
Com coproc utility , você obtém uma matriz, COPROC , que contém os arquivos de entrada e saída padrão de utility . Você pode então fazer coisas como
#!/bin/bash
coproc bc -l
for (( k = 0; k < 50; ++k )); do
printf '2.3*%d + 1\n' "$k" >&${COPROC[1]}
read -u "${COPROC[0]}" a
printf '%.2f\n' "$a"
done
kill "$COPROC_PID"
Aqui, bc -l é um co-processo e age como um "serviço de computação aritmética" para o loop de shell, usando expressões para calcular em sua entrada padrão e devolvendo resultados em sua saída padrão.
Até onde eu sei, bash também suporta apenas um co-processo um a qualquer momento.
O shell ksh93 também suporta coprocessos, mas a sintaxe é totalmente diferente (mas um pouco mais elegante). Este é o equivalente ao script ksh93 :
#!/usr/bin/ksh93
bc -l |&
coproc_pid=$!
for (( k = 0; k < 50; ++k )); do
print -p -f '2.3*%d + 1\n' "$k"
read -p a
printf '%.2f\n' "$a"
done
kill "$coproc_pid"
Aqui, é a opção -p para print e read que faz com que ele se comunique com o co-processo (o processo começou com |& ) em vez de usar algum filedescriptor explícito.