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

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

有人可以解释一下该exit命令在 Unix 终端中是如何工作的吗?

搜索man exitwhich 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内置命令获得。helphelp 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

相关内容