内置命令在bash中做什么?


35

我知道什么是内置命令,但是它builtin本身会做什么?执行which ls显示给我/bin/ls,但是执行不which builtin返回任何内容。

man builtin只是给了我一系列内置命令,其中一个是builtin。手册页的其余部分介绍了什么是内置函数,而不是什么builtin

builtin --help告诉我,builtin: usage: builtin [shell-builtin [arg ...]]但仍然不行。

它是否以其他内置命令无法使用的方式成为bash的一部分?


3
你忘了help builtin
伊格纳西奥·巴斯克斯

3
which builtin不返回任何结果,因为它which报告外部命令的位置。如果您询问外壳type builtin,它将毫不奇怪地告诉您builtin is a shell builtin。您会发现与aliasset等相同
Toby Speight

1
builtin help builtin
theonlygusti

Answers:


50

builtin命令确保您运行命令的Shell内置版本,而不是运行另一个具有相同名称的命令。

例如,假设您定义了一个名为shell的函数,该函数cd在每次更改目录时都会打印一些额外的状态。但是您搞砸了,现在无法正确更改目录。因此,现在您可以键入builtin cd ~以成功cd返回主目录,而无需运行损坏的shell函数。

顺便说一句,我的bash手册页副本有一个名为“ SHELL BUILTIN COMMANDS”的部分,它builtin在该部分中定义了命令的含义(如下所述)。

内置shell-builtin [参数]

    执行指定的内置shell,并传递参数,然后
    返回其退出状态。在定义函数时很有用
    其名称与内置的shell相同,保留
    函数内建函数的功能。内置的cd是
    通常以这种方式重新定义。

    如果shell-builtin不是shell内置,则返回状态为false
    命令。

14
好答案。但是让我感到奇怪的是,如何确定该builtin命令是bash真正的内置命令?
Pacopaco '17

14
@Pacopaco:你不能:-)。您也可以覆盖builtinfunction builtin { echo "Hi from builtin :-)"; }。然后builtin不再起作用。
sleske

12
@Pacopaco,type builtin会告诉您它是否是真实的builtin。除非type已被非内置的替换type...
Toby Speight

10
哦...很不幸,可以这样:别名unset =“ echo unset被覆盖”; alias alias =“ echo alias is overrided” ...所以这里没有运气。
奥利维尔·杜拉克

8
我喜欢正在进行的讨论!
Sam Weaver
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.