当任何命令返回非零退出代码时,set -e命令会使bash脚本立即失败。
是否有一种简单而优雅的方法来禁用脚本中单个命令的此行为?
《 Bash参考手册》(http://www.gnu.org/software/bash/manual/bashref.html)中记录了此功能的哪些位置?
当任何命令返回非零退出代码时,set -e命令会使bash脚本立即失败。
是否有一种简单而优雅的方法来禁用脚本中单个命令的此行为?
《 Bash参考手册》(http://www.gnu.org/software/bash/manual/bashref.html)中记录了此功能的哪些位置?
Answers:
像这样:
#!/usr/bin/env bash
set -e
echo hi
# disable exitting on error temporarily
set +e
aoeuidhtn
echo next line
# bring it back
set -e
ao
echo next line
跑:
$ ./test.sh
hi
./test.sh: line 7: aoeuidhtn: command not found
next line
./test.sh: line 11: ao: command not found
set
内置帮助中对此进行了描述:
$ type set
set is a shell builtin
$ help set
(...)
Using + rather than - causes these flags to be turned off.
此处记录了相同的内容:https : //www.gnu.org/software/bash/manual/bashref.html#The-Set-Builtin。
取消对错误的保释的替代方法是无论如何都强制成功。您可以执行以下操作:
cmd_to_run || true
这将返回0(true),因此不应触发set -e
faulty_cmd || :
是另一个流行的成语。(the :
是与同义词的命令true
)。
是否应用“立即退出外壳程序选项”或被忽略取决于执行命令的上下文(请参阅“内置内置集 -Bash 参考手册”部分 -感谢Arkadiusz Drabczyk)。
特别是,如果命令是if语句中测试的一部分,则忽略该选项。因此,可以使用以下if语句来执行命令并在“立即退出上下文”中检查命令的成功或失败:
#!/bin/bash
set -e
# Uncomment next line to see set -e effect:
#blubb
if blubb; then
echo "Command blubb was succesful."
else
echo "Command blubb failed. Exit code: $?"
fi
echo "Script exited normally."
可以省略“ then”语句并使用更少的行:
if blubb; then :;
else echo "Command blubb failed. Exit code: $?"; fi
实际上,我最近有一个类似的问题(尽管我没有发布,但我已经解决了),从我所看到的来看,似乎只是在命令之前使用set + e,而在之后使用set -e最优雅。这是一个示例,获取命令的响应并且不让错误将其丢弃。
#!/bin/sh
args=""
for argcol in $*
do
args="${args} ${argcol}"
done
fortunevar=""
fortfail=""
{
set +e
fortunevar=`fortune $args`
fortfail=$?
set -e
} &> /dev/null
if [ $fortfail == 0 ]
then
echo ${fortunevar}
say ${fortunevar}
else
echo misfortune: an illegal option was detected!
echo misfortune: usage: misfortune [-afilosw] [-m pattern][ [#%] file/directory/all]
fi
这将获取“ fortune”的输出,检查其退出状态,然后回显并说出来。我认为这是您要的东西,或者至少是类似的东西?无论如何,希望这会有所帮助。