Answers:
将此添加到脚本的开头:
set -e
如果一个简单的命令以非零退出值退出,这将导致shell立即退出。简单命令是不属于if,while或直到测试的一部分的任何命令,也不是&&或||的一部分的任何命令。清单。
有关更多详细信息,请参见“ set”内部命令上的bash(1)手册页。
我个人几乎以“ set -e”开始几乎所有的shell脚本。当某个脚本在中间出现故障并顽固地破坏了其余脚本的假设时,顽固地继续执行脚本确实很烦人。
bash script.sh
。
set -e; tf() { false; }; tf; echo 'still here'
。即使没有set -e
身体内部tf()
,执行被中止。也许您是想说那set -e
不是subshell继承的,这是正确的。
要添加到接受的答案中:
请记住,set -e
有时这还不够,特别是如果您有管道。
例如,假设您有此脚本
#!/bin/bash
set -e
./configure > configure.log
make
...可以按预期工作:错误configure
中止执行。
明天您将进行看似微不足道的更改:
#!/bin/bash
set -e
./configure | tee configure.log
make
...现在不起作用。此处对此进行了说明,并提供了一种解决方法(仅Bash):
#!/ bin / bash 设置-e 设置-o pipefail ./configure | tee配置文件 使
pipefail
与之相处的重要性set -o
!
您的示例中的if语句是不必要的。像这样做:
dosomething1 || exit 1
如果您接受了Ville Laurikari的建议并使用set -e
了某些命令,则可能需要使用以下命令:
dosomething || true
在|| true
将命令管道有一个true
即使命令失败,所以返回值-e
选项将不会终止该脚本。
set -e
不是以bash为中心-甚至在原始的Bourne Shell上也受支持。
如果您需要在退出时进行清理,则还可以将“ trap”与伪信号ERR一起使用。这与捕获INT或任何其他信号的方式相同。如果任何命令以非零值退出,则bash会抛出ERR:
# Create the trap with
# trap COMMAND SIGNAME [SIGNAME2 SIGNAME3...]
trap "rm -f /tmp/$MYTMPFILE; exit 1" ERR INT TERM
command1
command2
command3
# Partially turn off the trap.
trap - ERR
# Now a control-C will still cause cleanup, but
# a nonzero exit code won't:
ps aux | grep blahblahblah
或者,特别是如果您使用的是“ set -e”,则可以捕获EXIT;当脚本出于任何原因退出时(包括正常结束,中断,由-e选项引起的退出等),都会执行陷阱。
$?
很少需要该变量。伪习惯用语command; if [ $? -eq 0 ]; then X; fi
应始终写为if command; then X; fi
。
$?
需要进行检查的情况是需要针对多个值进行检查:
command
case $? in
(0) X;;
(1) Y;;
(2) Z;;
esac
或何时$?
需要重用或以其他方式处理:
if command; then
echo "command successful" >&2
else
ret=$?
echo "command failed with exit code $ret" >&2
exit $ret
fi
用-e
或set -e
在顶部运行它。
也看看set -u
。
help set
:将对未-u
设置变量的引用视为错误。
set -u
或set -e
不是,还是两者都不是?@lumpynose
只是抛出另一个供参考,因为Mark Edgars输入的内容还有一个附加问题,这是一个附加示例,涉及整个主题:
[[ `cmd` ]] && echo success_else_silence
这cmd || exit errcode
和别人展示的一样。
例如。如果要挂载,我要确保已卸载分区:
[[ `mount | grep /dev/sda1` ]] && umount /dev/sda1
[[
cmd`]]`不是一回事。如果命令的输出为空,则为false,否则为true,无论命令的退出状态如何。
set -e
,还可以做set -u
(或set -eu
)。-u
结束了这种愚蠢的,隐藏错误的行为,您可以访问任何不存在的变量,并在不进行诊断的情况下生成空白值。