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


14

有人可以解释一下该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 '{}' \;

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


只是要澄清一下:您是说,在为Anaconda和PyCharm安装附加软件包之后,当您exit退出终端会话时会遇到一系列错误-还是在此之后每次使用都exit发生这种错误?
G-Man说'恢复莫妮卡'

1
安装这些附加软件包后,在每个终端会话中都会发生这种情况。
arie64

1
很奇怪,您是否已经验证exit过别名?
Dominique

3
之所以尝试删除core文件,是因为它们通常是崩溃转储文件(核心转储),它们占用空间,但除非开发崩溃软件,否则很少有用。在这种情况下,它会尝试删除名为的目录core,该目录将失败(而且它失败了,numpy.core对NumPy来说是必不可少的!)。
nneonneo

目前,大多数系统都配置为默认情况下不写入核心转储(通过ulimit -c 0默认设置)。该find -exec rm命令无论如何我都不想要,但是您可以添加-type f它。您还可以通过使用-exec rm {} +代替来... \;使多个文件的删除效率更高,因此它将多个args批处理到一个rm命令行中(例如xargs)
Peter Cordes

Answers:


20

好吧,通常情况下,如果您手动配置了此功能,则只有在退出shell时才能看到执行。但是也许您安装的软件包之一带有bash退出shell脚本...

校验;

〜/ .bash_logout

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


OP并不是在讨论注销,而是在退出shell。

1
@countermode,他们也没有声明这不是在终端会话中运行的登录shell。
ilkkachu

我在登录外壳中,并且调用<code> logout </ code>时也会发生此行为。在我的<code>〜/ .bash_logout </ code>中,我有一行
arie64 '16

<code> find -xdev /(-name *〜-o -name ./*~ -o -name core)-exec \ rm'{}'/; </ code>在注释掉后,错误不会发生。因此,我认为注释正确无误,此行尝试删除临时文件。谢谢!
arie64

4
@ arie64-“ <code>”在注释中不起作用。要在SE注释中指示代码,请在代码前后使用“ ` ”(重音符号/左单引号)。喜欢:`find -xdev ...`来获取find -xdev ...
凯文·费根

25

man bash

  exit [n]
         [...]  A trap on EXIT is executed before the shell terminates.

此类陷阱通常用于在退出时清理tmpfile,请参阅 /programming/687014/removing-created-temp-files-in-unexpected-bash-exit

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

$ bash
$ trap "rm filetodelete" EXIT

显示定义的退出陷阱:

$ trap -p EXIT
trap -- 'rm filetodelete' EXIT

测试:

$ exit
rm: cannot remove filetodelete’: No such file or directory

注意,exit也可能隐式地称为“调用”。因此,不是exit您也可以通过触发陷阱kill -HUP $$


值得指出的是type -a exit->首先exit is a shell builtin是您如何了解bash手册页(或运行help exit而不是man)的。
彼得·科德斯

10

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

它以提供的退出状态(如果有的话)或最后一条命令的退出状态退出外壳。

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

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

你可以做一个 set -x在调用之前exit进行操作,以了解从何处运行这些命令。


调试的set -x
绝妙

您可以set -x通过以下方式运行bash 来获取输出日志:在终端退出后,bash不会清除或关闭终端,或者这样做set -xexec &> exit_log.txt然后盲目地键入exit
彼得·科德斯

3

exit是bash的“内置”命令,因此难怪man exit没有帮助。

可以从手册页man bash或使用helpbash 的内置命令(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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.