Shellに組み込まれた `printf`に与える数に制限はありますか?

Shellに組み込まれた `printf`に与える数に制限はありますか?

ユーティリティパラメータリストの/usr/bin/printf長さは、シェルの最大コマンドライン長です(つまり getconf ARG_MAX、私のシステムでは2097152);はい:

# try using a list that's way too long
/usr/bin/printf '%s\n' $(seq $(( $(getconf ARG_MAX) * 2 ))) | tail -1

出力:

bash: /usr/bin/printf: Argument list too long

今日私は聞いたその殻組み込み printfs にはこれらの制限はありません。

printf '%s\n' $(seq $(( $(getconf ARG_MAX) * 2 ))) | tail -1

出力:

4194304

質問:

  1. スキミングはman bash dashこれらの利点をあまり明らかにしないようです。組み込み printf。どこはい文書化されていますか?

  2. する組み込み printfS(例えば bash)には最大パラメータリスト長(文字)があります。では、その長さはいくらですか?

ベストアンサー1

特定のユーティリティの使用を擁護することは、実際にはマニュアルの責任ではありません。主にしなければならない説明する組み込みユーティリティを使用できます。

外部ユーティリティと比較して組み込みユーティリティを使用することの利点は、主に速度と拡張機能の可用性です(たとえば、printf変数bashを直接作成できますが、-v varname外部プログラムprintfでは決して作成できません)。

外部ユーティリティの実行は、組み込みユーティリティの実行に比べて遅くなります。特にループで頻繁に実行される場合は、さらにそうです。また、ご存知のように、より長い引数のリストも許可します(これは組み込みユーティリティのみをprintf許可するものではありません)。しかし、すべての組み込みユーティリティは)。

組み込みprintfユーティリティのパラメータリストの長さは、プロセス自体のbashリソース制限によって制限されますbash。一部のシステムでは、利用可能なRAMの大部分を使用してコマンドライン引数のリストを作成できることを意味する場合があります。

このようなさまざまな情報を確認できる文書は、

  • ソースbashコード、パラメータのリストが表示されます。printf動的に割り当てられた接続リストであり、いいえ使用execve()実行printf(外部ユーティリティを実行するときにパラメータリストの長さを制限する理由)。

シェルのprintfいいえ組み込みユーティリティはkshOpenBSDシェルです。ユーティリティは大丈夫です障害のある使用bashenable -n printf

おすすめ記事