`exit` 在哪里定义?

Isa*_*esh 2 bash exit which

假设我想要一个 bash 命令来做一些额外的事情。作为一个简单的例子,想象一下我只是想让它在运行前回显“123”。

一种简单的方法是为命令添加别名。由于我们仍然需要原始文件,我们可以通过它的确切路径来引用它,我们可以使用which. 例如:

$ which rm
/bin/rm
$ echo "alias rm='echo 123 && /bin/rm'" >> .bashrc
Run Code Online (Sandbox Code Playgroud)

这很容易,因为我能够查找rm使用which.

但是,我正在尝试使用 来执行此操作exit,并且which似乎对此一无所知。

$ which exit
$ echo $?
1
Run Code Online (Sandbox Code Playgroud)

该命令没有输出路径,实际上它返回了一个非零退出代码,which当命令不在$PATH.

我想也许这是一个函数,但显然事实并非如此:

$ typeset -F | grep exit
$ echo $?
1
Run Code Online (Sandbox Code Playgroud)

因此,该exit命令并未在任何地方定义为函数或 中的命令$PATH,但是,当我键入 时exit,它会关闭终端。所以它显然是在某处定义的,但我不知道在哪里。

它在哪里定义,我如何明确调用它?

cuo*_*glm 6

exit是一个 shell特殊的内置命令。它是用 shell 解释器构建的,shell 知道它并且可以直接执行它而无需搜索任何地方。

在大多数 shell 上,您可以使用:

$ type exit
exit is a shell builtin
Run Code Online (Sandbox Code Playgroud)

您必须阅读 shell 的源代码以查看其内置函数是如何实现的,这里是bashexit builtin源代码的链接。

使用bash, zsh, ksh93, mksh, pdksh,exit显式调用builtin内置命令,使用内置命令:

builtin exit
Run Code Online (Sandbox Code Playgroud)

请参阅如何显式调用内置的 shell?更多细节。