web-dev-qa-db-ja.com

Bashコマンドラインと入力制限

Bash(または他のシェル)で入力がどれくらいの長さになるのかについて、何らかの文字制限がありますか?もしそうなら、その文字制限は何ですか?

つまりコマンドラインを実行するには長すぎるコマンドをbashで書くことは可能ですか?必要な制限がない場合、推奨される制限はありますか?

80
Derek Halden

コマンドラインの長さの制限は、シェルではなく、オペレーティングシステムによって課されます。通常、この制限は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によって制限されません。制限はシェル組み込みにも適用されません。

111
Jens

はい、デニズン。そのため、私はかなり長い間、コマンドラインの長さの制限を福音として受け入れてきました。それでは、仮定をどうするか?当然、それらを確認してください。

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が失敗します。これには、環境データも含まれます。

40
Mike S