Eu agora mais menos resolvido nesta versão:
#!/bin/bash
in=/tmp/grunt_in
out=/tmp/grunt_out
err=/tmp/grunt_err
if [ ! -p $in ]
then
mkfifo $in
mkfifo $out
mkfifo $err
{ script -q -c "pig 1>$out 2>$err" <>$in; rm $in $out $err; } &
fi
{
echo "fs $*"
echo
echo "-- end"
} >$in
cat $err >&2 &
catpid=$!
sed -n -u '/^grunt> -- end/q;/^grunt>/d;p' <$out
kill $catpid
Portanto, eu simplesmente redireciono o stderr para dentro do comando script
. Eu também substituí as chaves redondas por chaves e removi o disown
porque não vi nenhuma vantagem em fazer isso. Eu também substituí o $err
por um FIFO para poder gerar uma saída antecipada, mas isso também adiciona algumas complicações para matar o cat
.
Isso funciona muito bem até agora exceto que quando eu truncar a saída pelo piping através de head
eu recebo uma saída truncada ou extra no próximo comando. Aparentemente, eu preciso de uma maneira de liberar corretamente os pipes nomeados. Eu ficaria feliz se alguém tiver alguma dica.