Shell-Builtin

如何區分內置和外部實用程序?(例如迴聲)

  • June 18, 2017

一些命令作為內置和外部實用程序提供。舉個echo例子。在我執行 Bash 3.2 的機器 (macOS) 上,

$ type echo
echo is a shell builtin

跑步man bash | less --pattern='^ *echo +\['節目:

echo [-neE] [arg ...]

但是執行man 1 echo顯示了一個不同實現的手冊頁echo,具有不同的簽名:

echo [-n] [string ...]

我能夠-e成功使用,所以我必須執行內置,大概就是這樣/bin/echo

$ which echo
/bin/echo

其他實現在哪裡,我如何區分內置和外部實用程序(例如printf

更新/更正感謝@Gilles 澄清。證據就在布丁裡!

$ /bin/echo -e "\tabc"
-e \tabc

$ echo -e "\tabc"
       abc

要確定是否內置命令,請執行type.

$ type echo
echo is a shell builtin

type它本身是一個內置命令,並且知道內置了哪些命令。(在 bash 中,可以禁用type內置命令,如果已禁用內置命令,將正確報告未內置命令。)type報告如果您使用命令將執行的任何內容name — 別名、函式、內置或外部命令。

which是一個外部命令,它報告外部命令的位置。它對別名、函式或內置函式一無所知。根據您的設置,它甚至可能不會報告正確的外部命令。只是忘記whichtype改用.

我必須執行內置的,大概就是這樣/bin/echo

不!根據定義,內置命令不是外部命令。與所有其他內置函式一樣,實現echo內置函式的程式碼位於/bin/bash. /bin/echo是一個與內置命令同名的外部命令echo

當命令既作為內置命令又作為外部命令存在時,使用它的名稱呼叫內置命令。命令名稱的優先順序是別名,然後是函式,然後是內置命令,然後是按順序列出的目錄中的外部命令$PATH。如果出於某種原因,您想強制執行外部命令,請使用其完整路徑。

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