(2 Antworten)
Vor 2 Jahren geschlossen.
Ich weiß, dass dies eine Art Duplikat einer anderen Frage ist (Warum gibt mir dieser Sortierbefehl eine leere Datei?), aber ich wollte die Frage als Antwort auf die gegebenen Antworten erweitern.
Der Befehl
shuf example.txt > example.txt
Gibt eine leere Datei zurück, da die Shell die Datei vor dem Mischen abschneidet und nur eine leere Datei zum Mischen übrig lässt. Allerdings
cat example.txt | shuf > example.txt
erzeugt wie erwartet eine gemischte Datei.
Warum funktioniert die Pipeline-Methode, wenn die einfache Umleitung nicht funktioniert? Wenn die Datei abgeschnitten wird, bevor die Befehle ausgeführt werden, sollte die zweite Methode nicht auch eine leere Datei hinterlassen?
Akzeptierte Antwort:
Das Problem ist, dass > example.txt
beginnt mit dem Schreiben in diese Datei, bevor shuf example.txt
beginnt es zu lesen. Da es noch keine Ausgabe gab, example.txt
leer ist, shuf
liest eine leere Datei und als shuf
macht in diesem Fall keine Ausgabe, das Endergebnis bleibt leer.
Ihr anderer Befehl kann unter demselben Problem leiden. > example.txt
kann die Datei vor cat example.txt
beenden beginnt es zu lesen; es hängt von der Reihenfolge ab, in der die Shell diese Dinge ausführt, und wie lange es dauert cat
um die Datei tatsächlich zu öffnen.
Um solche Probleme vollständig zu vermeiden, könnten Sie shuf example.txt > example.txt.shuf && mv example.txt.shuf example.txt
verwenden .
Oder Sie könnten mit shuf example.txt --output=example.txt
gehen stattdessen.