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の問題を回避することができます。