Isso está acontecendo porque nesta linha:
p+=( >( psql -X "host=$z.$domain dbname=$z $cred" ) )
... bash considera a linha como um comando completo. Ao fazer a substituição do processo, o STDIN do processo substituído é fechado quando o comando é concluído.
Existem apenas duas maneiras de ver isso:
- %código%. Não vamos lá.
- %código%. Vamos lá em vez disso:
p=()
for z in db1 db2 db3 xdb1
do
exec {fd}> >(psql -X "host=$z.$domain dbname=$z $cred")
p+=( $fd )
done
cd /dev/fd && exec tee "${p[@]}" >/dev/null
A sintaxe eval
faz com que o bash aloque um novo descritor de arquivo e atribua seu valor a exec
, que então é enviado para {fd}>
.
Agora $fd
é um monte de números de descritores de arquivos, que temos que ter $p
para escrever, então $p
to tee
onde os números do descritor de arquivos são arquivos reais e, em seguida, invocar cd
.
(Existem inúmeras outras maneiras de esfolar o gato, mas este é o primeiro e mais simples que surgiu na mente)