(2 respuestas)
Cerrado hace 2 años.
Sé que esto es una especie de duplicado de otra pregunta (¿Por qué este comando de clasificación me da un archivo vacío?), Pero quería ampliar la pregunta en respuesta a las respuestas dadas.
El comando
shuf example.txt > example.txt
Devuelve un archivo en blanco, porque el shell trunca el archivo antes de mezclarlo, dejando solo un archivo en blanco para mezclar. Sin embargo,
cat example.txt | shuf > example.txt
producirá un archivo aleatorio como se esperaba.
¿Por qué funciona el método de canalización cuando la redirección simple no funciona? Si el archivo se trunca antes de que se ejecuten los comandos, ¿no debería el segundo método también dejar un archivo vacío?
Respuesta aceptada:
El problema es que > example.txt comienza a escribir en ese archivo, antes de shuf example.txt comienza a leerlo. Entonces, como aún no había salida, example.txt está vacío, shuf lee un archivo vacío, y como shuf en este caso no genera ningún resultado, el resultado final permanece vacío.
Su otro comando puede sufrir el mismo problema. > example.txt puede eliminar el archivo antes de cat example.txt comienza a leerlo; depende del orden en que el shell ejecuta esas cosas y cuánto tiempo lleva cat para abrir el archivo.
Para evitar estos problemas por completo, puede usar shuf example.txt > example.txt.shuf && mv example.txt.shuf example.txt .
O podría ir con shuf example.txt --output=example.txt en su lugar.