内置命令在 bash 中有什么作用?

lfa*_*lin 35 bash

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

man builtin只是给了我一个内置命令列表,其中一个是builtin. 手册页的其余部分解释了内置是什么,而不是什么builtin是。

builtin --help告诉我,builtin: usage: builtin [shell-builtin [arg ...]]但仍然不是它的作用。

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

Spi*_*iff 50

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

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

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

内置 shell-builtin [参数]

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

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

  • @Pacopaco:你不能:-)。你也可以覆盖`builtin`:`function builtin { echo "Hi from builtin :-)"; }`。然后`builtin`不再有效。 (15认同)
  • 很好的答案。但让我想知道,你怎么能确定 `builtin` 命令是真正的 bash 内置命令? (14认同)
  • @Pacopaco,`type builtin` 会告诉你它是否是真正的 `builtin`。除非 `type` 已被替换为非内置的 `type`... (13认同)
  • 哦...不幸的是可以: alias unset="echo unset is overridden" ; alias alias="echo alias is overridden" ... 所以这里没有运气。 (10认同)
  • 我喜欢这个持续的讨论! (8认同)
  • 有趣的是:可以创建一个函数“unset”和“unalias”,但只有“unalias”有效: `unalias () { echo "A";} ; unset () { echo "B";} # 然后 unalias unalias 显示 'A',但是 unset unset 只是 unsets "unset()" !)`。所以你可以“可靠地”做:`unset unset; 取消取消别名;未设置内置;内置 unalias ; 内置的东西` (6认同)
  • 但是你仍然可以使用 `\builtin`。 (6认同)
  • @TobySpeight:我们需要更深入! (3认同)
  • @OlivierDulac 但是`"unset"`(带引号)不会被识别为别名。 (3认同)
  • 我不认为`builtin builtin`会解决这个问题 (2认同)