Wie @Zoonose richtig hervorhebt, hat jeder Dateideskriptor seine eigene Lese- / Schreib-Cursorposition in der Datei, mit der er verbunden ist. Und eine Datei kann entweder von der Shell geöffnet werden, wenn Sie eine Umleitung wie verwenden <>
, oder von einem Programm wie cat
.
Die Zahlen, die Sie als "Filedescriptor" betrachten, sind jedoch nur Verweise auf die tatsächlichen Filedescriptors im Kernel, und es ist völlig normal, dass ein Filedescriptor mehrere solcher Referenznummern hat, entweder innerhalb eines einzelnen Prozesses oder zwischen Prozessen.
Wenn Sie also ein Terminalfenster öffnen (oder sich mit ssh anmelden), beginnen Sie mit einem einzelnen Dateiskriptor, der für Ihr Terminal geöffnet ist und in Ihrem Shell-Prozess als fd # 0, fd # 1 und fd # 2 verbunden ist. Jeder Prozess, mit dem die Shell beginnt, erbt diese standardmäßig - außer wenn Sie Pipes oder Umleitungen verwendet haben.
Die Umleitung >>
kennzeichnet den Dateiskriptor als O_APPEND
, sodass beim Schreiben durch diesen Dateiskriptor der Cursor ignoriert wird und zum Ende der Datei gewechselt wird.
Durch die Umleitung >
wird die Zieldatei nur einmal abgeschnitten, bevor geschrieben wird. Daher wird jedes Schreiben danach normalerweise in den leeren Bereich nach dem Ende der Datei verschoben.
Writes in einer Datei tun nicht selbst Ursache Abschneiden; Sie ersetzen einfach alles, was sich an der aktuellen Position befindet, und strecken bei Bedarf das Dateiende.
Beachten Sie, somecmd >&88
dass das stdout (fd # 1) für somecmd den Dateiskriptor mit fd # 88 der aktuellen Shell teilt. Das heißt, es wird die O_APPEND
Option teilen , falls vorhanden. Es wird nicht dazu führen, dass es erneut abgeschnitten wird. Das ist eine einmalige Sache.
Was Sie in diesem Fall sehen, ist, dass es bei der Verwendung keine Kürzung gibt >&88
, da fd # 88 nicht mit geöffnet >>
wurde und daher Schreibvorgänge aus mehreren Prozessen verschachtelt werden können.