我正在使用以下选项
set -o pipefail
set -e
在bash脚本中停止执行错误。我有大约100行脚本正在执行,并且我不想检查脚本中每一行的返回码。
但是对于一个特定的命令,我想忽略该错误。我怎样才能做到这一点?
我正在使用以下选项
set -o pipefail
set -e
在bash脚本中停止执行错误。我有大约100行脚本正在执行,并且我不想检查脚本中每一行的返回码。
但是对于一个特定的命令,我想忽略该错误。我怎样才能做到这一点?
Answers:
解决方案:
particular_script || true
例:
$ cat /tmp/1.sh
particular_script()
{
false
}
set -e
echo one
particular_script || true
echo two
particular_script
echo three
$ bash /tmp/1.sh
one
two
three
将永远不会打印。
另外,我想补充一点,当pipefail
打开时,如果管道中的命令之一具有非零退出代码(pipefail
关闭该命令时必须关闭最后一个),那么shell认为整个管道具有非零退出代码就足够了。
$ set -o pipefail
$ false | true ; echo $?
1
$ set +o pipefail
$ false | true ; echo $?
0
(ldd $2/bin/* || true) | grep "not found" | wc -l
当ldd返回失败时脚本在此行之后终止
(ldd $2/bin/* || true) | grep "not found" | wc -l || true
set -o pipefail
。当grep
什么都没找到时,它返回非零退出代码,shell认为整个管道具有非零退出代码就足够了。
只需|| true
在命令后添加要忽略错误的位置即可。
set -e
和尝试捕获错误消息时很重要:例如set -e; TEST=$(foo 2>&1 || true); echo $TEST
不要停止并保存退出状态
以防万一您希望脚本在特定命令失败时不停止,并且还希望保存失败命令的错误代码:
set -e
EXIT_CODE=0
command || EXIT_CODE=$?
echo $EXIT_CODE
command
成功,因此需要运行之后的内容||
。读取为:如果command
失败,请执行EXIT_CODE=$?
。您可能只是做command || echo "$?"
或使用“陷阱”进行更详细的调试。看到这个-> stackoverflow.com/a/6110446/10737630
更简洁地说:
! particular_script
从POSIX规范中set -e
(重点是):
启用此选项时,如果简单命令由于Shell错误的后果中列出的任何原因而失败,或者返回退出状态值> 0,并且在经过一会儿,直到或if关键字之后,则不属于复合列表的一部分,并且不是AND或OR列表的一部分,也不是前面带有!的管道。保留字,然后外壳应立即退出。
-e
。
if
子句中并解决了问题。
除了“返回true”,还可以使用“ noop”或null实用程序(如POSIX规范中所述),:
而只是“不执行任何操作”。您将保存一些字母。:)
#!/usr/bin/env bash
set -e
man nonexistentghing || :
echo "It's ok.."
在使用CLI工具时,我一直在使用下面的代码段,我想知道是否存在某些资源,但是我不在乎输出。
if [ -z "$(cat no_exist 2>&1 >/dev/null)" ]; then
echo "none exist actually exist!"
fi
if [ -r not_exist ]
虽然|| true
是首选,但您也可以
var=$(echo $(exit 1)) # it shouldn't fail
output=$(*command* 2>&1) && exit_status=$? || exit_status=$?
echo $output
echo $exit_status
使用此示例创建日志文件的示例
log_event(){
timestamp=$(date '+%D %T') #mm/dd/yy HH:MM:SS
echo -e "($timestamp) $event" >> "$log_file"
}
output=$(*command* 2>&1) && exit_status=$? || exit_status=$?
if [ "$exit_status" = 0 ]
then
event="$output"
log_event
else
event="ERROR $output"
log_event
fi
感谢您上面提供的简单解决方案:
<particular_script/command> || true
以下构造可用于脚本步骤的其他操作/故障排除和其他流控制选项:
if <particular_script/command>
then
echo "<particular_script/command> is fine!"
else
echo "<particular_script/command> failed!"
#exit 1
fi
exit 1
如果需要,我们可以阻止进一步的行动。
-e
属性设置为“如果失败的命令是紧跟在awhile
或until
关键字之后的命令列表的一部分,if
语句中的测试的一部分,所执行的任何命令的一部分时,“不退出外壳程序” 在一个&&
或||
名单除了在最终的命令&&
或||
管道中,任何命令,但最后,或者命令的返回状态被倒置!
“。