Linuxコマンドラインの文字制限


27

コマンドラインでスクリプトに変数を渡します。コマンドの文字制限は何ですか?例えば:

$ MyScript reallyreallyreally...reallyreallyreallylongoption

ありがとう。


1
質問が理解できません。キャラクターの制限に興味がありますか?
krissi

質問をより明確に述べる必要があります。
ThatGraemeGuy

回答:


27

シェル/ OSが課す制限は一般に非常に長く、通常は1〜20万文字です。

getconf ARG_MAXコマンドの最大入力制限を提供します。Debianシステムでは、現在、128 * 1024である131072を返します。私の記憶が正しく機能するかのように、環境変数によって制限が緩和されます。これらはシェルによって同じ構造で渡されますが、ほとんどの場合、数百文字しか取り外せません。この値の概算を実行するにenv | wc -cは、このマシンでのこのログインの現在の時刻に325文字が推奨されます。

スクリプトはこの完全な長さを許可する可能性がありますが、他のユーティリティが意図的または設計上の問題によって独自の制限を課す可能性は低くありません。また、長いコマンドラインの個々の引数の長さや、ファイルへのパスの長さには人為的な制限がある場合があります。


2
私のシステムでgetconf ARG_MAXは、2097152を指定しますが、渡すことができる最大引数長はまだ131071です(環境のサイズを差し引く必要はありません)。
追って通知があるまで一時停止します。

1
また、巨大な引数リストを扱うときは、それxargsを覚えておいてfind -execください。
コアダンプ

@Dennis:によって返される値は、getconfカーネルレベルです。おそらくbashはその設計/構成によって下限を設定していますか?また、これについての私の知識は少し前からのものであるため、最近は少し変わった可能性がありますが、新しい実験的なシェルを除いて、多くの動きが見られるとは期待されていません。
デビッドスピレット

私は同じ結果を得ますkshzshdashfish私はエラーメッセージからバッシュ4で行ったようにしてバッシュ3 fish有益かもしれ:「魚:引数と環境リストの合計サイズ(130KB)は2.0メガバイトのオペレーティング・システムの制限を超えています」ただし、set | wc -c306317とenv | wc -c2507は違いを考慮していません。他に何がカウントされているのかわかりません。
追って通知があるまで一時停止します。


1

最長の可変長とは何ですか?それを理解するには、perlの「x」を使用して非常に長い変数名を作成できます。

 VAR=`perl -e 'print "a"x131071'` ; bash a.sh $VAR

私のシステムでは131071が機能します:

変数は131072で出力され、大きすぎます:

VAR=`perl -e 'print "a"x131072'` ; bash a.sh $VAR
bash: /bin/bash: Argument list too long

2
実際、それは非常に長い変数です。
追って通知があるまで一時停止します。

3
また、あなたが使用する必要はありませんperlし、スクリプト:/bin/echo "$(printf "%*s" 131071 ".")">/dev/null
一時停止を追って通知があるまで。

しかし、@ DennisWilliamsonはprintf '%s\n' "$(printf '%*s' 131072 .)" >/dev/null機能します。
ジャーノ

これprintfは、シェルが組み込まbashれているexec()ため、別のプロセスを生成するためにを行う必要がないためです。ARG_MAX唯一の引数リストの長さに重要execな機能(exec()execl()execlp()execvp()execvpe()、など)。
ビセンテオリバートリエラ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.