有人可以解释一下该exit
命令在 Unix 终端中是如何工作的吗?
搜索man exit
和which exit
没有帮助,我遇到了以下问题。
在我的新 Red Hat 系统上安装 Anaconda 和 PyCharm 的附加软件包后,我注意到每当我调用exit
退出终端会话时,我都会收到一系列错误,然后终端按预期退出。这些错误似乎表明我对 的调用exit
正在触发调用rm ~/anaconda3/.../
和rm ~/PyCharm/....
,从而导致错误。所有目录似乎也是我为这些程序下载的软件包的位置(即 numpy),请参见下文。
$ exit
rm: cannot remove ‘~/anaconda3/lib/python3.5/site-packages/numpy/core’: Is a directory
...
...
解决
在我的~/.bash_logout
文件中,有一行
find ~ -xdev ( -name *~ -o -name .*~ -o -name core ) -exec \rm '{}' \;
注释掉这一行可以停止错误消息。它似乎搜索并删除所有临时文件。但它也会尝试查找其中包含“core”一词的目录,并将其删除。这是系统预设的。
答案1
man bash
exit [n] [...] A trap on EXIT is executed before the shell terminates.
此类陷阱通常用于在退出时清理 tmpfiles,请参阅 https://stackoverflow.com/questions/687014/removing-created-temp-files-in-unexpected-bash-exit
像这样定义一个退出陷阱(为了在新 shell 中更好地进行测试):
$ bash
$ trap "rm filetodelete" EXIT
显示定义的 EXIT 陷阱:
$ trap -p EXIT
trap -- 'rm filetodelete' EXIT
测试:
$ exit
rm: cannot remove ‘filetodelete’: No such file or directory
请注意,exit
也可以隐式“调用”。因此,exit
您也可以通过 触发陷阱kill -HUP $$
。
答案2
通常,如果您手动配置了此选项,您只会在退出 shell 时看到执行。但也许您安装的软件包之一附带了 bash 退出 shell 脚本...
查看;
〜/ .bash_logout
也许你会从那里找到一个脚本调用,这是一个奇怪的......
答案3
该exit
命令是一个特殊的命令内置shell 中的命令。它必须是内置的,因为它需要退出 shell 进程。
它退出 shell,并提供退出状态(如果有)或最后一个命令的退出状态。
退出时,shell 将运行EXIT
陷阱(如果有)。查看trap
当前设置的输出(在类似 Bourne 的 shell 中)。
对于许多 shell,如果 shell 作为登录 shell 调用(某些系统/用户配置终端仿真器来启动登录 shell),它还将运行存储在特殊文件(如、)中的代码~/.logout
,~/.zlogout
可能~/.bash_logout
还运行/etc
与 shell 对应的代码。
您可以set -x
在调用之前执行此操作exit
以了解这些命令是从哪里运行的。
答案4
exit
是 bash 的“内置”命令,难怪man exit
没有帮助。
正确的文档可以从手册页或使用bash ( ) 的man bash
内置命令获得。help
help exit
$ help exit
exit: exit [n]
Exit the shell.
Exits the shell with a status of N. If N is omitted, the exit status
is that of the last command executed.
$
如果你真的想知道如何它有效,看看来源:http://git.savannah.gnu.org/cgit/bash.git/tree/builtins/exit.def?h=bash-4.4