コマンド引数の文字数制限 – Argument list too long

UNIX系OSで実行するコマンドの最大の長さは execve(2) の制限に依存するそうです。

プログラムの実行引数の制限については、長さの制限は OS によって異なり、FreeBSD では 64KB、Linux のあるディストリビューションでは 128KB、SunOS4〜Solaris は 1MB、HP-UX 10.20 までは 20KB (パッチを当てれば 2MB)、HP-UX 11.x 以降は 2MB です。

この値は伝統的に ARG_MAX というマクロ定数で定義されているため、使っている UNIX, Linux, Mac OS X の ARG_MAX を調べたい場合は /usr/include を ARG_MAX で grep するか、getconf コマンドを使って

% getconf ARG_MAX

結果:

65536

とすることで調べることができます。

FreeBSD なら sysctl で

% sysctl -A kern.argmax

結果:

kern.argmax: 65536

としてもいいです。
なお、ARG_MAX は 4096 以上であるべき、と POSIX には規定されています。

2017年2月現在のコマンドライン最大文字数の参考値が知りたくて、
手元のマシンいくつかで試してみました。

  • CentOS release 6.8 (Final / さくらのVPS) … 2621440文字

  • Scientific Linux release 6.2 (Carbon / さくらのVPS) … 2621440文字

  • Mac OS X Sierra (Macbook Pro 2015) … 262144文字

  • Debian(Jessie / さくらのクラウド) … 2097152文字

最低でも20万文字ということで、あまり気にする機会はなさそうですが、
もし大量のファイルを扱う場合などにArgument list too longエラーがでたときは、
以下のように xargs などを使うとARG_MAXの制限を回避できます。

grep foo /path/to/too-many-files/*

たとえばこのように、ワイルドカードでエラーが出てしまう場合、

echo /path/to/too-many-files/* | xargs grep foo

のように echo と xargs を組み合わせるとエラーなく動作します。

なぜこれならエラーにならないかというと、echoはプログラムではなくシェルの内部コマンドなので文字数制限(ARG_MAXの制限)を受けないためです。

また、xargsはARG_MAXの値を把握しているので、引数がARG_MAXを超えそうになると、自動的に複数回に分割して実行してくれるため、ARG_MAXの問題を回避することができます。