ユーティリティパラメータリストの/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
今日私は聞いたその殻組み込み printf
s にはこれらの制限はありません。
printf '%s\n' $(seq $(( $(getconf ARG_MAX) * 2 ))) | tail -1
出力:
4194304
質問:
スキミングは
man bash dash
これらの利点をあまり明らかにしないようです。組み込みprintf
。どこはい文書化されていますか?する組み込み
printf
S(例えばbash
)には最大パラメータリスト長(文字)があります。では、その長さはいくらですか?
ベストアンサー1
特定のユーティリティの使用を擁護することは、実際にはマニュアルの責任ではありません。主にしなければならない説明する組み込みユーティリティを使用できます。
外部ユーティリティと比較して組み込みユーティリティを使用することの利点は、主に速度と拡張機能の可用性です(たとえば、printf
変数bash
を直接作成できますが、-v varname
外部プログラムprintf
では決して作成できません)。
外部ユーティリティの実行は、組み込みユーティリティの実行に比べて遅くなります。特にループで頻繁に実行される場合は、さらにそうです。また、ご存知のように、より長い引数のリストも許可します(これは組み込みユーティリティのみをprintf
許可するものではありません)。しかし、すべての組み込みユーティリティは)。
組み込みprintf
ユーティリティのパラメータリストの長さは、プロセス自体のbash
リソース制限によって制限されますbash
。一部のシステムでは、利用可能なRAMの大部分を使用してコマンドライン引数のリストを作成できることを意味する場合があります。
このようなさまざまな情報を確認できる文書は、
- ソース
bash
コード、パラメータのリストが表示されます。printf
動的に割り当てられた接続リストであり、いいえ使用execve()
実行printf
(外部ユーティリティを実行するときにパラメータリストの長さを制限する理由)。
シェルのprintf
例いいえ組み込みユーティリティはksh
OpenBSDシェルです。ユーティリティは大丈夫です障害のある使用bash
。enable -n printf