我的终端中以非零代码退出的任何命令都会关闭我的终端窗口


22

起初这有点有趣,就像玩“ Bash Roulette” ...但是现在它已经变老了。

我的终端中以非零代码退出的任何命令都会关闭我的终端窗口

有人告诉我,也许我set -e在终端机上的某个地方设置了一些bash脚本。

我已经检查了.bash_profile// .bashrc/ .profile,看起来好像不在set -e那里。

还有其他明显的罪魁祸首吗?


7
执行set +e,是否可以解决问题?如果是这样(我假设是这样),那么您需要继续寻找set -e。可能是这些文件的全局版本下的/etc,也可能是来自这些文件的任何其他脚本。如果问题已解决,请将配置文件移开,然后以较小的块重新添加行以查看中断的位置。
egmont

3
PS4=' ${BASH_SOURCE}:$LINENO: ' bash -lixc true |& grep -e set -e trap可能会提供信息。
muru

您可以使用特殊变量检查当前启用的外壳标志集,-如下所示:echo $-
David Foerster

Answers:


21

好吧,的确如此,这是一个任性的事set -e引起了我的麻烦。

我发现set -e使用的方式bash -lx

最好的办法是使用:

bash -lx > lx.log 2>&1

然后打开该日志文件并进行搜索set...

一旦发现任性的问题,set -e您可以删除该行,而您的问题就应该消除了!(重启机器可能是个好主意)。

就我而言,该set -e文件位于.bash_profile来源的文件中,但该行不在.bash_profile本身中。


3
source与“随机shell脚本”相比,可以安全地放在shell中的东西要小得多。 -e在实际脚本中有用,可用于检查错误。(或者确保您不会忘记对任何内容进行错误检查。)
彼得·科德斯

显然是这样...我希望有这样的东西global set -eset -e只影响包含脚本的脚本
Alexander Mills

@AlexanderMills,为此,您可以检查$-以检查内部脚本中的标志并在末尾恢复其状态,或者如果您知道有源脚本将其设置,则只需在主脚本中将其
重置

所以我想local set -e只能在bash函数中使用?
亚历山大·米尔斯

13

如果您只是想解决问题,请set +e.bashrc末尾添加。

您可以进行挖掘-可能还有很多其他地方set -e-但这会解决很多问题。

但是,如果set -e属于您的一部分,$PROMPT_COMMAND则以上内容将无效。尝试printf '%s\n' "$PROMPT_COMMAND"看看里面有什么。


在我的机器上,当我打开终端时,printf '%s\n' "$PROMPT_COMMAND"仅产生空白,而没有任何内容
Alexander Mills

@AlexanderMills,那不是您的问题所在。一种常见的用法$PROMPT_COMMAND是更新终端选项卡名称或窗口名称。MacOS X和Ubuntu都可以做到这一点。请参阅apple.stackexchange.com/q/220641/151730,以获取有关Mac的数据。
通配符

我找到了这个问题的答案,并加入我自己的答案,set +e没有工作,也许是因为它是之前set -e我的bash的源文件调用。
亚历山大·米尔斯

1
@AlexanderMills,是的,我认为那是隐含的。我的意思是附加 set +e到您的.bashrc,而不是一开始就放入。我已经在回答中明确指出了这一点。很好,您找到了源!
通配符

是的,set +e显然只是一个创可贴,但是您说过
亚历山大·米尔斯
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.