Bash

功能是否等同於 bash / shell 腳本語言中的內置命令?

  • April 13, 2019

例子

$ echo "This is great"
This is great
$ num2=2
$ num3="Three"
$ echo $num2
2
$ echo $num3
Three

重新定義迴聲:

$ echo(){ command echo "The command was redefined"; }
$ echo $num2
The command was redefined
$ echo $?
The command was redefined

這是真的嗎?Unix shell 中的所有命令都是函式嗎?我們可以這樣操作它們嗎?

不,所有 Unix 命令都不是 shell 函式,但它們可能會被 shell 函式覆蓋。

Shell 函式名稱不受內置或外部實用程序名稱的限制。正如您可能在不同路徑下擁有多個同名的外部實用程序一樣,您也可能擁有同名的 shell 函式或別名。

如果呼叫了一個函式foo並呼叫了一個外部或內置實用程序foo,那麼該函式foo將被呼叫。

要強制 shell 選擇內置實用程序,請使用

builtin foo

為避免使用該功能foo,請使用

command foo

為了保證使用外部實用程序而不是 shell 函式、別名或內置實用程序,請使用它的完整路徑,例如

/bin/echo

別名和函式佔用相同的命名空間,因此您不能擁有同名的別名和函式。


簡而言之:

Unix 命令可能是

  • 別名,或
  • 外殼函式,或
  • 內置在外殼中的實用程序,或
  • 外部實用程序(編譯的二進製文件或以任何腳本語言編寫的腳本)。

一些“命令”不是命令而是關鍵字,例如forif。這些也可能被別名和 shell 函式覆蓋,以獲得額外的令人興奮的 shell 體驗(即不要這樣做)。

不可以。雖然可以通過與函式相同的命名空間來訪問內置函式,但它們仍然是獨立的實體,即使被函式隱藏,也可以通過builtin內置命令訪問(為了更有趣,您當然可以重新定義builtin☺)。另請注意,如果您unset -f echo將返回內置函式。

顧名思義,內置函式也是在從echo.def等文件生成的 C 程式碼中內置和實現的(在 bash 的情況下) 。

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