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.