Linux では、シェルでコマンドに渡す引数の数に上限があります。たとえばたくさんのファイルに対して foobar * のようにコマンドを実行しようとして Argument list too long エラーが出たならば、原因はこれです。

簡単に調べた所、この上限は ARG_MAX として定義されているようです。私の Ubuntu (64bit) 環境では、以下の値になっていました。

$ getconf ARG_MAX
2097152

この ARG_MAX については、man 3 sysconf に以下の通り説明されていました。

ARG_MAX - _SC_ARG_MAX
    The maximum length of the arguments to the exec(3) family of
    functions. Must not be less than _POSIX_ARG_MAX (4096).

この説明に従うと、引数長の上限は exec 系のシステムコールに渡す引数の関係で生まれているように見えます。しかし、一体どういう限界が上限を生んでいるのでしょうか?

実際の ARG_MAX の値を見るに、そこまで大きな値ではありません。私の環境では ARG_MAX がちょうど 2²¹ に等しいので何かしら訳があってこの値になっているのだと思いますが、何故この値になっているのかが分かりません。

また、ARG_MAX による引数長の制限は echo などのシェル組み込みコマンドにはありません。つまりこの上限は引数そのものを管理する際に現れる限界ではなく、exec をする際の何らかの限界によってもたらされているものだと思うのですが、そこから先が分かりません。

そこで、質問です。

質問

  • シェルコマンドに渡す引数長の上限は、何故必要なのでしょうか?
  • 特に、ARG_MAX はどのように決定されているのでしょうか?