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.