Considérant ce Q&A sur l'ordre d'exécution dans le shell en ce qui concerne la redirection, et malgré le fait que si un fichier n'existe pas, il est créé en premier afin que cat example.txt | shuf > example.txt
ne se plaint pas que le fichier n'existe pas - ce qui confirme simplement l'ordre d'après ce que je comprends - alors pourquoi est-ce qu'environ une fois tous les mille fois sur mon système, le shuffle fonctionne lorsque je fais cela (la sauvegarde contient 15 valeurs statiques chacune sur leur ligne)
for i in $(seq 1 1000); do
cp backup test
echo $i
cat test | shuf > test
cat test
done
Comment peut-il apparemment y avoir une exception à la règle ?
Réponse acceptée :
Ici :
cat test | shuf > test
>
a priorité dans le sens où cela signifie :
(cat test) | (shuf > test)
et non :
(cat test | shuf) > test
Bien que si nous utilisions deux fichiers différents, il n'y aurait de toute façon aucune différence entre ces deux groupes.
Ce qui devient important lorsque vous utilisez le même fichier, c'est que les deux commandes de chaque côté du tuyau s'exécutent simultanément . Ces commandes sont cat test
et shuf > test
. >
signifie "ouvert pour l'écriture et tronqué", alors que cat
va "ouvrir pour la lecture", lire et fermer. Étant donné que ces deux choses se produisent simultanément , la relation entre l'ordre de leurs opérations collectives est indéterminée . Il y a une chance que cat
obtiendra de saisir le fichier avant que le shell ne gère shuf > test
le tronque. Mais c'est une mince chance, car il y a plus impliqué; cela n'arrivera que si cat
est très chanceux en ce qui concerne la programmation de shuf > test
.
Morale de l'histoire : Ne faites pas cela - utilisez plutôt deux fichiers.