システム全体のパラメータ数制限はシェル関数に適用されますか?

システム全体のパラメータ数制限はシェル関数に適用されますか?

別の問題find■ビルドコマンドの制限についてお問い合わせください-exec ... {} +。ここでは、これらの制限がシェルの内部制限とどのように比較されるのか疑問に思います。システム制約を模倣するか、それとも独立していますか?これらは何ですか?

私はBashユーザーですが、単に好奇心が強いので、UnixとLinuxのシェルを学びます。

答え1

システム全体のパラメータ数制限はシェル関数に適用されますか?

execve()いいえ。これは、現在の実行可能ファイルを置き換えるために別の実行可能ファイルを実行するためにプロセスによって使用されるシステムコールの制限です。これは、同じプロセスで現在のシェルインタプリタによって解釈される関数には適用されません。組み込みユーティリティでも機能しません。

execve()新しい実行可能ファイルをロードして起動する前に、プロセスのメモリを消去してください。関数と組み込みのポイントは、これが起こらないということです。したがって、関数はシェルの変数やその他の引数を変更できるため、通常いいえ使用execve()

システム制限を模倣していますか?

いいえ。

それとも独立ですか?

はい。

これらは何ですか?

現在、シェルプロセスのリソース制限に応じて許可されています。

これバッシュマニュアル説明する:

配列サイズには最大制限はなく、メンバーを連続的にインデックス付けまたは割り当てる必要もありません。

これは、関数パラメータが内部シェル配列(execカーネル関数に渡されない)であるために適用されるようです。

歴史的に、配列インデックスには下限がありましたが、関数引数の数に制限はありませんでしたksh88pdkshBourne シェルでのみ$1、 ... に直接アクセスできますが、関数に$9複数の引数を渡すことができます。たとえば、ループを使用してすべての引数を繰り返すfor arg do...か、別の関数または組み込み関数に渡すことができます。"$@"

関連情報