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