Aqui:
cat test | shuf > test
> tem precedência no sentido de que isso significa:
(cat test) | (shuf > test)
e não:
(cat test | shuf) > test
Embora se usássemos dois arquivos diferentes, não haveria nenhuma diferença entre esses dois agrupamentos de qualquer maneira.
O que se torna significativo quando você usa o mesmo arquivo é que os dois comandos em ambos os lados do canal são executados simultaneamente . Esses comandos são cat test e shuf > test . > significa "aberto para escrita e truncamento", enquanto cat vai "abrir para leitura", ler e fechar. Como essas duas coisas estão acontecendo simultaneamente , a relação entre a ordem de suas operações coletivas é indeterminada . Há uma chance de que cat consiga fazer o slurp antes de o shell gerenciar shuf > test o truncar. Mas essa é uma pequena chance, já que há mais envolvimento; Isso só acontecerá se cat tiver muita sorte em relação ao agendamento de shuf > test .
Moral da história: Não faça isso - use dois arquivos.