我想在 bash 脚本中使用 set -e ,但每次运行它时,任何错误都会杀死我的 shell。
say I have script.sh:
#! /usr/bin/env bash
set -e
my_commmand
my_other_command
my_command
无论我是否这样做,都会出现错误炸毁我的外壳:
% ./script.sh (after chmod)
或者
% . ./script.sh
一定有一个简单的方法可以解决这个问题。
答案1
您的意思是您的交互式 shell 退出了吗?
如果您获取从交互式 shell 中设置的脚本(使用.
)set -e
,则“exit-on-error”标志也将在交互式 shell 中设置。如果您之前已经这样做过,那么它将适用于您之后运行的任何命令,无论是源脚本 ( . ./script.sh
) 还是正常启动的脚本 ( ./script.sh
)。
解决方案是不要源脚本set -e
。
您可能还想查看Bash常见问题解答 105关于其他问题set -e
。
答案2
如果您想set -e
进入交互式 shell,并且想要执行可能返回非零的命令,则需要捕获该退出代码。一种方法:
$ some_command || :
其他:
$ if ! some_command; then :; fi
答案3
如果您确实在登录 shell 中调用过set -e
,然后运行返回复合语句中未使用的非零退出代码的命令,那么您的登录 shell 将退出:
set -e
false
会将您注销。
set -e
如果您曾经运行过包含使用您在登录 shell 中. ./script
设置的脚本。-e
如果您稍后运行任何带有非零退出代码的命令:bingo。