Gab es am Ende jedes Skripts eine '\ 0'?

7

Ich frage mich, wie Sie das Ende eines Skripts / einer Datei derterminiert haben. Ich interessiere mich besonders für alte Unix-Versionen (wie V6).

Gibt es nach dem letzten geschriebenen Zeichen ein '\ 0'?

Joey
quelle
2
Shell-Skripte sind Textdateien und sollten daher im Idealfall keine Null-Bytes enthalten, obwohl dies die normale Verwendung wahrscheinlich nicht beeinträchtigt.
Goldlöckchen

Antworten:

12

Userland-Programme unter noch älteren Unixen sahen am Ende einer Datei keine "Pad" -Bytes. Ich weiß, dass MS-DOS oder CP / M Plattenblöcke mit Strg-Z-Zeichen füllen würden, sodass ein Algorithmus zum Lesen von Dateien nicht nur nach Plattenendblöcken suchen musste, sondern auch nach Auffüllbytes.

Unixes haben so etwas nie gemacht. Programme lesen Bytes, bis der Dateiende-Zustand read(2)eintritt , was für den Systemaufruf die Rückgabe von 0 bedeutet. Leider kann ein lang laufender Systemaufruf unterbrochen werden, wodurch read()der Fehlercode (-1) zurückgegeben wird und das globale Symbol errnoausgewertet wird zu EINTR, so führen Unixe auch traditionell etwas Dummheit in das Lesen bestimmter Geräte ein.

Dies alles hat auch einen Dateisystemaspekt: ​​Unix-Dateisysteme würden Daten in Plattenblöcke einfügen und einen Wert für die Dateigröße in Bytes im Inode beibehalten. Einige andere Betriebssysteme haben die Dateigröße nur in Blöcken beibehalten. Wenn die Daten kleiner als ein Block waren, stieg das Problem mit Pad-Bytes oder anderem Unsinn in das Benutzerland auf.

Bruce Ediger
quelle
5
CP / M würde 128-Byte-Datensätze mit Strg + Z füllen, DOS hat dies jedoch noch nie getan - es wird immer die genaue Dateilänge aufgezeichnet, genau wie bei Unix (obwohl viele Programme ^ Z als Dateiende-Markierung akzeptiert haben).
psmears
@psmears Ich habe DOS-Dateien mit ^ Z-Füllbytes gesehen, vor langer Zeit. Ich denke, es könnte ein DOS 1.x-Problem gewesen sein oder möglicherweise nur ein Problem mit Programmen, die für CP / M geschrieben und dann auf DOS 1.x portiert wurden. IIRC, WordStar-Dateien hatten ^ Z-Füllbytes ... das wäre Mitte der 1980er Jahre gewesen. Beachten Sie, dass selbst für eine Weile, nachdem DOS 2.0 herauskam und alles geändert hat, noch einige Programme im Umlauf waren, die für DOS 1.x geschrieben wurden und immer noch funktionierten (mit anderen Worten, DOS 2.x war abwärtskompatibel).
Steveha
3
@steveha: Ich vermute, "für CP / M geschrieben und dann portiert" ist die Erklärung (wie es für viele alte seltsame DOS-Sachen ist :))
psmears
Wie wurden Binärdateien (die eine beliebige Bytesequenz enthalten können) auf Systemen behandelt, die Padding verwendeten?
Orion
1
@orion gute Frage - Ich schlage vor, Sie machen es eine neue separate.
Peterph
4

Nicht unbedingt. Der Shell-Interpreter liest die Datei mit dem Skript unter Verwendung eines (mehr oder weniger komplexen) Syscall-Wrappers (z. B. read()von fread()), der den Zustand des Dateiende signalisiert, wenn er das letzte Byte der Datei erreicht (was nicht erforderlich ist) Null sein).

Peterph
quelle