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.