In Anbetracht dieser Fragen und Antworten zur Ausführungsreihenfolge in der Shell in Bezug auf die Umleitung und trotz der Tatsache, dass eine nicht vorhandene Datei zuerst erstellt wird, sodass cat example.txt | shuf > example.txt
beschwert sich nicht, dass die Datei nicht existiert – was nach meinem Verständnis nur die Reihenfolge bestätigt – warum funktioniert dann etwa alle tausend Mal auf meinem System der Shuffle, wenn ich dies tue (Backup enthält jeweils 15 statische Werte auf ihre Linie)
for i in $(seq 1 1000); do
cp backup test
echo $i
cat test | shuf > test
cat test
done
Wie kann es scheinbar eine Ausnahme von der Regel geben?
Akzeptierte Antwort:
Hier:
cat test | shuf > test
>
hat Vorrang in dem Sinne, dass dies bedeutet:
(cat test) | (shuf > test)
und nicht:
(cat test | shuf) > test
Wenn wir jedoch zwei verschiedene Dateien verwenden würden, gäbe es sowieso keinen Unterschied zwischen diesen beiden Gruppierungen.
Was wichtig wird, wenn Sie dieselbe Datei verwenden, ist, dass die beiden Befehle auf beiden Seiten der Pipe gleichzeitig ausgeführt werden . Diese Befehle sind cat test
und shuf > test
. >
bedeutet „zum Schreiben öffnen und abschneiden“, während cat
wird „zum Lesen öffnen“, lesen und schließen. Da diese beiden Dinge gleichzeitig passieren , ist die Beziehung zwischen der Reihenfolge ihrer kollektiven Operationen unbestimmt . Es besteht die Möglichkeit, dass cat
wird die Datei einschlürfen, bevor die Shell shuf > test
verwaltet schneidet es ab. Aber das ist eine geringe Chance, da mehr beteiligt ist; es wird nur passieren, wenn cat
hat großes Glück in Bezug auf die Planung von shuf > test
.
Moral der Geschichte: Tun Sie dies nicht – verwenden Sie stattdessen zwei Dateien.