Ich habe versucht, schnell eine .hgignore
zu bearbeiten Datei aus der Cygwin-Bash-Shell, und ich habe eine Zeile hinzugefügt, die ein Fehler war. Ich bin mir nicht sicher, ob dies der beste Weg war, aber ich dachte schnell daran, head -1 .hgignore
zu verwenden um die störende Zeile zu entfernen (ich hatte zuvor nur eine Zeile in der Datei). Sicher genug, wenn es ausgeführt wird, gibt es die erste Zeile als einzige Ausgabe.
Aber als ich versuchte, die Ausgabe umzuleiten und die Datei mit head -1 .hgignore > .hgignore
neu zu schreiben , die Datei war leer. Warum passiert das? Wenn ich stattdessen versuche, anzuhängen, head -1 .hgignore >> .hgignore
, es wird korrekt angehängt, aber das ist offensichtlich nicht das gewünschte Ergebnis. Warum funktioniert eine abgeschnittene Weiterleitung in diesem Fall nicht?
Akzeptierte Antwort:
Wenn die Shell eine Befehlszeile erhält wie:command > file.out
die Shell selbst öffnet (und erstellt möglicherweise) die Datei mit dem Namen file.out
. Die Shell setzt den Dateideskriptor 0 auf den Dateidateideskriptor, den sie von open erhalten hat. So funktioniert die E/A-Umleitung:Jeder Prozess kennt die Dateideskriptoren 0, 1 und 2.
Der schwierige Teil dabei ist wie um file.out
zu öffnen . Meistens möchten Sie file.out
zum Schreiben bei Offset 0 geöffnet (d. h. abgeschnitten) und das hat die Shell für Sie getan. Es hat .hgignore abgeschnitten, zum Schreiben geöffnet, den Dateideskriptor auf 0 gesetzt und dann head
ausgeführt . Sofortiges Datei-Clobbing.
In der Bash-Shell führen Sie ein set noclobber
durch um dieses Verhalten zu ändern.