Posix

對 yash shell 中的 printf 是否是內置命令有點困惑

  • October 22, 2020

根據其手冊yash, shell 有一個printf內置的。

但是,這是我在yash預設配置的 shell 中看到的:

$ command -v printf
/usr/bin/printf
$ type printf
printf: a regular built-in at /usr/bin/printf

這個shell中是否printf內置了一個?對於許多其他所謂的內置實用程序,這些實用程序也可作為外部命令使用,結果是相似的。

作為比較,在pdkshksh在 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

yashShell確實printf具有並且確實使用了(和其他實用程序)的內置版本。它恰好在製定command -vandtype命令的結果的方式上非常符合 POSIX 標準。

正如 mosvy 評論一樣,POSIX 標準要求正常內置命令可用作$PATH要執行的內置版本的命令的外部命令。

這是標準中的相關文本

命令搜尋和執行

如果一個簡單的命令產生一個命令名稱和一個可選的參數列表,則應執行以下操作:

  1. 如果命令名稱不包含任何 <slash> 字元,則將出現以下順序中的第一個成功步驟:

* 一種。如果命令名稱與特殊內置實用程序的名稱匹配,則應呼叫該特殊內置實用程序。

$$ … $$ * e. 否則,應使用 XBD 環境變數中描述的 PATH 環境變數搜尋命令:

 + 一世。**如果搜尋成功:**
 	- 一種。**如果系統已將該實用程序實現為正常內置函式或 shell 函式,則應在路徑搜尋的此時呼叫它。**
 	- 灣。否則,shell 在單獨的實用程序環境中執行實用程序$$ ... $$  
		
 	$$ ... $$
 + ii. 如果搜尋不成功,命令將失敗,退出狀態為 127,並且 shell 將寫入錯誤消息。
  1. 如果命令名稱包含至少一個 <slash>,$$ … $$

這意味著 的輸出command -v printf表示在搜尋路徑printf找到了該命令,而 的輸出添加了該命令是正常內置命令。type printf

由於printf在搜尋路徑中找到了該命令,並且由於它是 shell 中的正常內置命令,yash因此將呼叫其內置版本的命令。如果在路徑printf找到 ,並且yashshell 以 POSIX-ly 正確模式執行,則會生成錯誤。

yash以成為一個非常符合 POSIX 的外殼而自豪,如果我們看看POSIX 所說command -v的話,這也是正確的:

-v

將字元串寫入標準輸出,指示 shell 將在目前 shell 執行環境(請參閱Shell 執行環境)中呼叫command_name但不呼叫的路徑名或命令command_name

  • 實用程序、正常內置實用程序command_names包括&lt;slash&gt;字元)以及使用該PATH變數找到的任何實現定義的函式(如命令搜尋和執行中所述),應寫為絕對路徑名

引用自:https://unix.stackexchange.com/questions/496259