Bash
功能是否等同於 bash / shell 腳本語言中的內置命令?
例子
$ 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 命令可能是
- 別名,或
- 外殼函式,或
- 內置在外殼中的實用程序,或
- 外部實用程序(編譯的二進製文件或以任何腳本語言編寫的腳本)。
一些“命令”不是命令而是關鍵字,例如
for
等if
。這些也可能被別名和 shell 函式覆蓋,以獲得額外的令人興奮的 shell 體驗(即不要這樣做)。
不可以。雖然可以通過與函式相同的命名空間來訪問內置函式,但它們仍然是獨立的實體,即使被函式隱藏,也可以通過
builtin
內置命令訪問(為了更有趣,您當然可以重新定義builtin
☺)。另請注意,如果您unset -f echo
將返回內置函式。顧名思義,內置函式也是在從echo.def等文件生成的 C 程式碼中內置和實現的(在 bash 的情況下) 。