Gibt es Shell-Dienstprogramme auf modernen Unix-ähnlichen Betriebssystemen, die nicht mit Textdateien mit sehr langen Zeilen arbeiten können?

Gibt es Shell-Dienstprogramme auf modernen Unix-ähnlichen Betriebssystemen, die nicht mit Textdateien mit sehr langen Zeilen arbeiten können?

Der Wert von kann LINE_MAXdurch Ausführen ermittelt werden getconf LINE_MAX. Unter FreeBSD 12 und Ubuntu 18.04 (und ich vermute vielen anderen) beträgt dieser Wert 2048 Bytes.

In der POSIX-Welt gibt es viele Shell-Dienstprogramme, die speziell für die Arbeit mit Textdateien entwickelt wurden. Eine Datei, deren Zeile mehr als 100 LINE_MAXBytes lang ist (einschließlich Zeilenumbruch), ist keine Textdatei (jedenfalls gemäß der Definition von POSIX). Ein Shell-Dienstprogramm, das Textdateien als Eingabe verwendet, ist nicht erforderlich, um diese Art von Datei ordnungsgemäß verarbeiten zu können.

In der Praxis scheine ich kein Dienstprogramm zu finden, das nicht mit Textdateien mit wirklich langen Zeilen umgehen kann. Meines Wissens haben GNU-Dienstprogramme keine wirkliche Begrenzung dafür, wie lang eine Zeile in einer Textdatei sein darf (bei FreeBSD bin ich mir nicht sicher).

Ist irgendjemandem ein Shell-Dienstprogramm auf einem modernen oder halbmodernen Betriebssystem bekannt, das bei Zeilen, die LINE_MAXBytes lang sind, ins Stocken gerät? Abgesehen davon: Sind Programmiersprachen wie Perl und Python vom Wert von betroffen LINE_MAX?

Antwort1

Es gibt auf dieser Site mindestens ein Beispiel für ein Shell-Dienstprogramm, das LINE_MAXzumindest unter bestimmten Umständen an hält.OpenBSDcut; das tut es nichtDrosselauf längeren Zeilen, aber einige seiner Fähigkeiten sind auf die ersten LINE_MAXZeichen einer Zeile beschränkt.

Zusätzlich zu Dienstprogrammen, die sich weigern, mit längeren Zeilen zu arbeiten, gibt es ein allgemeines Muster, das möglicherweise unerwünschtes Verhalten verursacht: Eingaben werden oft verarbeitet mit

fgets(line, sizeof line, fp);

wobei lineein LINE_MAXZeichenarray mit der Größe - ist (siehe z. B.pam_localuser). Wenn linejedes Mal verarbeitet wird, fgetswenn nicht - zurückgegeben wird NULL, wird die Eingabe mit Zeilen verarbeitet, die bei aufgeteilt werden, LINE_MAXwenn sie zu lang sind. Daher wird in pam_localusereine Zeile, die /etc/passwdlänger als ist, LINE_MAXals zwei Zeilen behandelt.

Die Programmiersprachen und Parsergeneratoren, die ich mir angesehen habe, haben keine Referenz darauf LINE_MAX(außer Pass-Through-Referenzen, um den Wert für Programme verfügbar zu machen, die in diesen Sprachen geschrieben sind). Dazu gehören GCC, Perl, Python und Lua.

verwandte Informationen