(2 réponses)
Fermé il y a 2 ans.
Je sais que c'est une sorte de doublon d'une autre question (Pourquoi cette commande de tri me donne un fichier vide ?) Mais je voulais développer la question en réponse aux réponses données.
La commande
shuf example.txt > example.txt
Renvoie un fichier vide, car le shell tronque le fichier avant de le mélanger, ne laissant qu'un fichier vide à mélanger. Cependant,
cat example.txt | shuf > example.txt
produira un fichier mélangé comme prévu.
Pourquoi la méthode du pipeline fonctionne-t-elle alors que la redirection simple ne fonctionne pas ? Si le fichier est tronqué avant l'exécution des commandes, la deuxième méthode ne devrait-elle pas également laisser un fichier vide ?
Réponse acceptée :
Le problème est que > example.txt
commence à écrire dans ce fichier, avant shuf example.txt
commence à le lire. Donc, comme il n'y avait pas encore de sortie, example.txt
est vide, shuf
lit un fichier vide, et comme shuf
ne fait aucune sortie dans ce cas, le résultat final reste vide.
Votre autre commande peut souffrir du même problème. > example.txt
peut tuer le fichier avant cat example.txt
commence à le lire ; cela dépend de l'ordre dans lequel le shell exécute ces choses et du temps que cela prend cat
pour réellement ouvrir le fichier.
Pour éviter complètement de tels problèmes, vous pouvez utiliser shuf example.txt > example.txt.shuf && mv example.txt.shuf example.txt
.
Ou vous pouvez utiliser shuf example.txt --output=example.txt
à la place.