LINE_MAX
を実行するとの値を取得できますgetconf LINE_MAX
。FreeBSD 12 および Ubuntu 18.04 (おそらく他の多くの OS でも) では、この値は 2048 バイトです。
POSIX の世界には、テキスト ファイルの操作に特化したシェル ユーティリティが多数あります。1 行のLINE_MAX
長さがバイト (改行を含む) を超えるファイルは、テキスト ファイルではありません (POSIX の定義による)。テキスト ファイルを入力として受け取るように設計されたシェル ユーティリティは、この種のファイルを適切に処理できる必要はありません。
実際には、非常に長い行を持つテキスト ファイルを処理できないユーティリティを見つけることはできないようです。GNU ユーティリティには、テキスト ファイルの行の長さに関する実際の制限はないと私は理解しています (FreeBSD についてはよくわかりません)。
長さがバイトを超える行を処理する、最新または比較的新しいオペレーティング システム上のシェル ユーティリティを知っている人はいますかLINE_MAX
? 余談ですが、Perl や Python などのプログラミング言語は の値の影響を受けますかLINE_MAX
?
答え1
LINE_MAX
このサイトには、少なくともいくつかの状況では、に固執するシェルユーティリティの例が少なくとも1つあります。オープンBSDcut
; そうではありませんむせさせるそれより長い行でも実行できますが、一部の機能は行LINE_MAX
の最初の文字に制限されます。
長い行の処理を完全に拒否するユーティリティに加えて、潜在的に望ましくない動作を引き起こす一般的なパターンがあります。入力は多くの場合、
fgets(line, sizeof line, fp);
ここで はサイズの文字配列line
ですLINE_MAX
(例えばpam_localuser
)。line
が を 処理するたびに がfgets
以外を返す場合、入力は で行が長すぎる場合にNULL
で分割されて処理されます。したがって では、よりも長い の行は2 行として処理されます。LINE_MAX
pam_localuser
/etc/passwd
LINE_MAX
私が調べたプログラミング言語とパーサー ジェネレーターには、参照がありませんLINE_MAX
(それらの言語で記述されたプログラムで値を利用できるようにするためのパススルー参照を除く)。これには、GCC、Perl、Python、および Lua が含まれます。