Bash(または他のシェル)で入力がどれくらいの長さになるのかについて、何らかの文字制限がありますか?もしそうなら、その文字制限は何ですか?
つまりコマンドラインを実行するには長すぎるコマンドをbashで書くことは可能ですか?必要な制限がない場合、推奨される制限はありますか?
コマンドラインの長さの制限は、シェルではなく、オペレーティングシステムによって課されます。通常、この制限は100キロバイトの範囲です。 POSIXは、この制限ARG_MAX
を示し、POSIX準拠システムでは、この制限を照会できます。
$ getconf ARG_MAX # Get argument limit in bytes
例えば。 Cygwinではこれは32000であり、私が使用するさまざまなBSDおよびLinuxシステムでは131072から2621440までのどこかにあります。
この制限を超えるファイルのリストを処理する必要がある場合は、xargs
ユーティリティを調べてください。このユーティリティは、ARG_MAX
を超えない引数のサブセットでプログラムを繰り返し呼び出します。
特定の質問に答えるために、はい、引数リストが長すぎるコマンドを実行しようとする可能性があります。シェルは、「引数リストが長すぎます」というメッセージとともにエラーを出します。
プログラムへの入力(stdinまたは他のファイル記述子で読み取られる)はnot制限されていることに注意してください(利用可能なプログラムリソースのみ)。したがって、シェルスクリプトが変数に文字列を読み込む場合、ARG_MAX
によって制限されません。制限はシェル組み込みにも適用されません。
はい、デニズン。そのため、私はかなり長い間、コマンドラインの長さの制限を福音として受け入れてきました。それでは、仮定をどうするか?当然、それらを確認してください。
Fedora 22マシンを自由に使用できます(つまり、bash4を搭載したLinux)。各18文字の500,000のiノード(ファイル)を含むディレクトリを作成しました。コマンドラインの長さは9,500,000文字です。このように作成:
seq 1 500000 | while read digit; do
touch $(printf "abigfilename%06d\n" $digit);
done
そして、私たちは注意します:
$ getconf ARG_MAX
2097152
ただし、私はこれを行うことができます:
$ echo * > /dev/null
しかし、これは失敗します:
$ /bin/echo * > /dev/null
bash: /bin/echo: Argument list too long
Forループを実行できます。
$ for f in *; do :; done
これは別のシェル組み込みです。
ARG_MAX
のドキュメント 状態、exec関数への引数の最大長を注意深く読んでください。つまり、exec
を呼び出さなければ、ARG_MAX
の制限はありません。したがって、ShellビルトインがARG_MAX
によって制限されない理由を説明できます。
実際、引数リストが109948ファイル、または約2,089,000文字(ギブまたはテイク)の場合、ディレクトリをls
できます。ただし、18文字のファイル名ファイルをもう1つ追加すると、Argument list too longエラーが表示されます。したがって、ARG_MAX
は広告どおりに機能しています。引数リストにARG_MAX
文字を超えると、execが失敗します。これには、環境データも含まれます。