O problema é que > example.txt
começa a gravar nesse arquivo, antes de shuf example.txt
começar a lê-lo. Portanto, como ainda não houve saída, example.txt
está vazio, shuf
lê um arquivo vazio e como shuf
não produz saída nesse caso, o resultado final fica vazio.
Seu outro comando pode sofrer o mesmo problema. > example.txt
pode matar o arquivo antes que cat example.txt
comece a lê-lo; isso depende da ordem em que o shell executa essas coisas e quanto tempo leva cat
para realmente abrir o arquivo.
Para evitar totalmente esses problemas, você pode usar shuf example.txt > example.txt.shuf && mv example.txt.shuf example.txt
.
Ou você poderia usar shuf example.txt --output=example.txt
.