utility1 | utility2 >output
não é equivalente a
( utility1 | utility2 ) >output
mas para
utility1 | { utility2 >output; }
Os dois utilitários são iniciados praticamente ao mesmo tempo, o que significa que você esperaria que seu comando retornasse às vezes 3 e às vezes 2.
Exemplo:
$ { [ -f test ] && echo exists >&2; } | { echo >test; }; rm test
$ { [ -f test ] && echo exists >&2; } | { echo >test; }; rm test
$ { [ -f test ] && echo exists >&2; } | { echo >test; }; rm test
exists
$ { [ -f test ] && echo exists >&2; } | { echo >test; }; rm test
exists
$ { [ -f test ] && echo exists >&2; } | { echo >test; }; rm test
$ { [ -f test ] && echo exists >&2; } | { echo >test; }; rm test
O exemplo acima mostra que o arquivo criado pelo lado direito do pipeline é algumas vezes detectado pelo lado esquerdo do pipeline.