Isso é semelhante a algumas outras respostas.
Se você tiver o pacote “moreutils”, deverá ter o comando sponge
. Experimente
commandA | sponge | { IFS= read -r x; { printf "%s\n" "$x"; cat; } | commandB; }
O comando sponge
é basicamente um filtro de passagem (como cat
)
exceto que ele não começa a gravar a saída até ler a entrada inteira.
Ou seja, "absorve" os dados e depois os libera quando você os aperta (como uma esponja).
Então, até certo ponto, isso é "trapacear" -
Se houver uma quantidade não trivial de dados, sponge
certamente usará um arquivo temporário.
Mas é invisível para você; você não precisa se preocupar com coisas domésticas
como escolher um nome de arquivo exclusivo e limpar depois.
O { IFS= read -r x; { printf "%s\n" "$x"; cat; } | commandB; }
lê a primeira linha de saída de sponge
.
Lembre-se de que isso não aparece até que commandA
tenha terminado.
Então ele dispara commandB
, escreve a primeira linha no pipe,
e invoca cat
para ler o restante da saída e gravar no pipe.