exit 命令如何在 Unix 终端上工作?

ari*_*e64 14 command-line bash exit

有人可以解释该exit命令在 Unix 终端中的工作原理吗?

搜索man exit which exit没有帮助,我遇到了以下问题。

在我的新 Red Hat 系统上安装 Anaconda 和 PyCharm 的附加软件包后,我注意到每当我打电话exit退出终端会话时,我都会收到一系列错误,然后终端按预期退出。这些错误似乎表明我的调用exit正在触发调用rm ~/anaconda3/.../and rm ~/PyCharm/....,从而导致错误。所有目录似乎也是我为这些程序(即 numpy)下载的包的位置,见下文。

$ exit
rm: cannot remove ‘~/anaconda3/lib/python3.5/site-packages/numpy/core’: Is a directory
...
...
Run Code Online (Sandbox Code Playgroud)

解决

在我的~/.bash_logout文件中,有一行

find ~ -xdev ( -name *~ -o -name .*~ -o -name core ) -exec \rm '{}' \;

注释掉这一行停止了错误消息。它似乎搜索并删除所有临时文件。但它也会尝试查找其中包含“core”一词的目录,并将其也删除。这是系统中的预设。

rud*_*ier 25

man bash

  exit [n]
         [...]  A trap on EXIT is executed before the shell terminates.
Run Code Online (Sandbox Code Playgroud)

此类陷阱通常用于在退出时清理 tmpfile,请参阅 /sf/ask/48091011/

定义这样的退出陷阱(以便在新 shell 中进行更好的测试):

$ bash
$ trap "rm filetodelete" EXIT
Run Code Online (Sandbox Code Playgroud)

显示定义的 EXIT 陷阱:

$ trap -p EXIT
trap -- 'rm filetodelete' EXIT
Run Code Online (Sandbox Code Playgroud)

测试:

$ exit
rm: cannot remove ‘filetodelete’: No such file or directory
Run Code Online (Sandbox Code Playgroud)

请注意,它exit也可能被隐式地“调用”。所以代替exit你也可以触发陷阱kill -HUP $$


mik*_*sey 20

通常,如果您手动配置了它,您只会在退出 shell 时看到执行。但也许您安装的其中一个软件包附带了 bash 退出 shell 脚本...

查看;

~/.bash_logout

也许你会从那里找到一个脚本调用,这是一个奇怪的调用......

  • @arie64 - "<code>" 在注释中不起作用。要在 SE 注释中指明代码,请在代码前后使用“**\`**”(重音/左单引号)。像:\`find -xdev ...` 得到`find -xdev ...`。 (4认同)

Sté*_*las 10

exit命令是shell 中一个特殊的内置命令。它必须是内置的,因为它需要退出 shell 进程。

如果有任何或最后一个命令的退出状态,它会以退出状态退出 shell。

退出时,shell 将运行EXIT陷阱(如果有)。查看trap当前设置的(在类似 Bourne 的 shell 中)的输出。

由于许多炮弹,如果(有些系统/用户配置终端仿真程序来启动登录shell)的外壳被调用作为登录shell,它也将运行存储在特殊文件中的代码一样~/.logout~/.zlogout~/.bash_logout并有可能在相应的那些/etc依赖于壳.

您可以set -x在调用之前执行 aexit以了解这些命令的运行位置。