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.