對 yash shell 中的 printf 是否是內置命令有點困惑
根據其手冊
yash
, shell 有一個printf
內置的。但是,這是我在
yash
預設配置的 shell 中看到的:$ command -v printf /usr/bin/printf $ type printf printf: a regular built-in at /usr/bin/printf
這個shell中是否
printf
內置了一個?對於許多其他所謂的內置實用程序,這些實用程序也可作為外部命令使用,結果是相似的。作為比較,在
pdksh
(ksh
在 OpenBSD 上, whereprintf
不是內置的):$ command -v printf /usr/bin/printf $ type printf printf is /usr/bin/printf
並且在
bash
(哪裡printf
是內置的):$ command -v printf printf $ type printf printf is a shell builtin
yash
Shell確實printf
具有並且確實使用了(和其他實用程序)的內置版本。它恰好在製定command -v
andtype
命令的結果的方式上非常符合 POSIX 標準。正如 mosvy 評論一樣,POSIX 標準要求正常內置命令可用作
$PATH
要執行的內置版本的命令的外部命令。這是標準中的相關文本:
命令搜尋和執行
如果一個簡單的命令產生一個命令名稱和一個可選的參數列表,則應執行以下操作:
- 如果命令名稱不包含任何 <slash> 字元,則將出現以下順序中的第一個成功步驟:
* 一種。如果命令名稱與特殊內置實用程序的名稱匹配,則應呼叫該特殊內置實用程序。
$$ … $$ * e. 否則,應使用 XBD 環境變數中描述的 PATH 環境變數搜尋命令:
+ 一世。**如果搜尋成功:** - 一種。**如果系統已將該實用程序實現為正常內置函式或 shell 函式,則應在路徑搜尋的此時呼叫它。** - 灣。否則,shell 在單獨的實用程序環境中執行實用程序$$ ... $$ $$ ... $$ + ii. 如果搜尋不成功,命令將失敗,退出狀態為 127,並且 shell 將寫入錯誤消息。
- 如果命令名稱包含至少一個 <slash>,$$ … $$
這意味著 的輸出
command -v printf
表示在搜尋路徑中printf
找到了該命令,而 的輸出添加了該命令是正常內置命令。type printf
由於
printf
在搜尋路徑中找到了該命令,並且由於它是 shell 中的正常內置命令,yash
因此將呼叫其內置版本的命令。如果在路徑printf
中未找到 ,並且yash
shell 以 POSIX-ly 正確模式執行,則會生成錯誤。
yash
以成為一個非常符合 POSIX 的外殼而自豪,如果我們看看POSIX 所說command -v
的話,這也是正確的:
-v
將字元串寫入標準輸出,指示 shell 將在目前 shell 執行環境(請參閱Shell 執行環境)中呼叫
command_name
但不呼叫的路徑名或命令command_name
。
- 實用程序、正常內置實用程序(
command_names
包括<slash>
字元)以及使用該PATH
變數找到的任何實現定義的函式(如命令搜尋和執行中所述),應寫為絕對路徑名。