A maioria das soluções até agora lida mal com o problema da linha parcial. Suponha por um segundo que os programas são:
cmd1() {
perl -e 'while(1) { print "a"x3000_000,"\n"}'
}
export -f cmd1
cmd2() {
perl -e 'while(1) { print "b"x3000_000,"\n"}'
}
export -f cmd2
Ao executá-los em paralelo, você deseja que a saída tenha linhas completas de a s seguidas por linhas completas de b s. O que você não quer é a s e b s misturando na mesma linha ( tr -s ab substitui a repetição a s por um único a , então é mais fácil ver o que acontece):
# This is bad - half lines are mixed
$ (cmd1 & cmd2 ) | tr -s ab
bababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababa
ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
Se você usar o GNU Parallel, você terá linhas cheias de linhas com a s ou b s, mas nunca misturadas:
$ parallel --line-buffer ::: cmd1 cmd2 | tr -s ab
a
a
b
b
b
b
a
Novas versões do GNU Parallel até evitam o preenchimento de seu disco: O acima pode ser executado para sempre.