函数是否等同于 bash / shell 脚本语言中的内置命令?

函数是否等同于 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 中的所有命令都可以运行并且我们可以这样操作它们吗?

答案1

不是。虽然内置函数可以通过与函数相同的命名空间进行访问,但它们仍然是独立的实体,即使被函数遮蔽,也可以通过builtin内置命令进行访问(为了增加乐趣,您当然可以重新定义builtin☺)。还请注意,如果您unset -f echo将内置函数恢复原状。

顾名思义,内置函数也是在从文件生成的 C 代码中内置和实现的(在 bash 的情况下),例如回声.def

答案2

不,所有 Unix 命令都不是 shell 函数,但它们可能会被 shell 函数覆盖。

Shell 函数名称不受内置或外部实用程序名称的限制。正如您可能在不同路径下有多个同名的外部实用程序一样,您也可能有一个 shell 函数或同名的别名。

如果调用了一个函数foo并且还调用了外部或内置实用程序,则将调用foo该函数。foo

要强制 shell 选择内置实用程序,请使用

builtin foo

要避免使用该函数foo,请使用

command foo

为了保证使用外部实用程序而不是 shell 函数、别名或内置实用程序,请使用其完整路径,例如

/bin/echo

别名和函数占用相同的命名空间,因此别名和函数不能同名。


简而言之:

Unix 命令可能是

  • 别名,或
  • 外壳函数,或
  • shell 中内置的实用程序,或者
  • 外部实用程序(编译的二进制文件或用任何脚本语言编写的脚本)。

一些“命令”不是命令,而是关键字,例如forif等。这些也可能被别名和 shell 函数覆盖,以获得额外令人兴奋的 shell 体验(即不要这样做)。

相关内容