(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.