質問: 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` がちょうど 221 に等しいので何かしら訳があってこの値になっているのだと思いますが、何故この値になっているのかが分かりません。 また、`ARG_MAX` による引数長の制限は `echo` などのシェル組み込みコマンドにはありません。つまりこの上限は引数そのものを管理する際に現れる限界ではなく、`exec` をする際の何らかの限界によってもたらされているものだと思うのですが、そこから先が分かりません。 そこで、質問です。 質問 -- * シェルコマンドに渡す引数長の上限は、何故必要なのでしょうか? * 特に、`ARG_MAX` はどのように決定されているのでしょうか?
回答: 必要性ってことだと「コンピュータのメモリは有限だから」でしょう。特に UNIX の開発された頃1970~80年代のメモリ容量はとても少なかった( MicroVAX II のメモリ容量は 1MB )ことを忘れてはいけません。 極端な例なら MS-DOS のコマンドラインは PSP (Program Segment Prefix) の offset 0x80 以後に配置される関連で最大長 127 文字です (offset 0x80 はコマンドライン長) UNIX の世界でも、今起動しようとしているこの1個のプロセスのコマンドラインを確保するためだけに残メモリを全て使ってしまうと他の起動済みプロセス全てに影響を及ぼしかねないので、制約を設けるのはとても合理的です。 数値がなぜこの値か、についてはウチの HPUX11.11 の `/usr/include/limits.h` には下記のようなコメントが入っています。 > > The default values are provided here because the constants are specified by several publications including XPG (X/Open Portability Guide) Issue 2 and SVID (System V Interface Definition) Issue 2. > > `#define ARG_MAX 2048000` /* maximum length of arguments ... */ > > > オイラ勝手訳 > > ここで提供されているデフォルト値は XPG2 や SVID2 などの文書によって指定されている定数です。 > > > 理由なり根拠なりが説明されているとしたらこの辺の文書にありそうですが、今オイラに XPG2 や SVID2 を探す時間が無いのでその辺は他の人にお任せで。 シェルの組み込みコマンドの場合、メモリが許す限りコマンドライン引数をとっても「別プロセスを起動しないので」許されるとかそういう考えなのかもと邪推(裏づけなし)。