~からprintfがyashの組み込み部分かどうかに関する質問、来ているこの回答はPOSIX標準を参照しています。。
答えは、POSIX検索順序が必要なコマンドの外部実装を見つけ、シェルがそれを組み込みとして実装した場合は組み込みを実行することです。 (サポートされていない組み込み機能の場合特殊内蔵.)
POSIXで内部実装の実行を許可する前に外部実装が必要なのはなぜですか?
…ランダムだと思うので気になりました。
ベストアンサー1
これは「まるで」ルールです。
つまり、実装が標準の外部コマンドをシェル組み込みとして提供することを決定した場合、ユーザーが見るシェルの動作を変更しないでください。
私が示した比較はhttps://unix.stackexchange.com/a/496291/5132(一方では)PD Korn、MirBSD Korn、およびHeirloom Bourneシェル、(他方では)Z、93 Korn、Bourne Again、およびDebian Almquistシェルの動作の間で(クラッピング手で)この点を強調します。
printf
組み込み機能を持たないシェルの場合、呼び出しを削除すると動作が停止し/usr/bin
ます。フィットモードでは、Watanabeシェルが表すPOSIXフィットアクションは同じ結果をもたらします。組み込み関数を持つシェルの動作は次のとおりです。PATH
printf
printf
まるで外部コマンドを呼び出しています。
/usr/bin
ただし、すべての資格のないシェルの動作は削除されてもPATH
変わりません。いいえ外部コマンドを呼び出すかのように振る舞います。
標準が保証しようとしているのは、シェルがすべての種類の一般的な外部コマンドを組み込むことができ(またはそれを独自のシェル機能として実装することができます)、次のような場合に組み込みで同じ動作を得ることです。検索コマンドを防止するように調整すると、PATH
外部コマンドを使用できます。PATH
呼び出すことができるコマンドを選択して制御できるツールです。
(説明通りhttps://unix.stackexchange.com/a/448799/5132数年前、人々は再生される内容を変更してUnixの性格を選びましたPATH
。 )
命令を出すことだと思うかもしれません。いつも働いて見つけることができるかどうかに関係なくPATH
実はそれがポイントだ一般的な外部コマンドを組み込みます。 (printenv
実際、これが私のnoshツールセットにバージョン1.38に組み込みコマンドが含まれている理由です。いいえ地獄のように。 )
しかし、標準では、以下を見ることができることを保証します。同じ汎用外部コマンドの動作は、その関数を呼び出す他の非シェルプログラムで見られるように、シェルでは起動されず、シェルは他のプログラムがPATH
同じコマンドを使用して見つからない汎用外部コマンドを魔法のように実行しません。execvpe()
)PATH
。ユーザーの観点から見ると、すべてが一貫して機能し、どのように動作するかPATH
を制御するツールです。