我正在使用以下选项
set -o pipefail
set -e
Run Code Online (Sandbox Code Playgroud)
在bash脚本中停止执行错误.我有100个脚本执行,我不想检查脚本的返回代码.但对于特定的脚本,我想忽略错误.我怎样才能做到这一点 ?
Igo*_*bin 679
解决方案:
particular_script || true
Run Code Online (Sandbox Code Playgroud)
例:
$ 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
Run Code Online (Sandbox Code Playgroud)
three 将永远不会打印.
另外,我想补充说,当pipefail打开时,当管道中的一个命令具有非零退出代码时,shell认为整个管道具有非零退出代码就足够了(pipefail关闭它必须是最后一个) .
$ set -o pipefail
$ false | true ; echo $?
1
$ set +o pipefail
$ false | true ; echo $?
0
Run Code Online (Sandbox Code Playgroud)
Lar*_*off 164
只需|| true在要忽略错误的命令后添加.
Lil*_*ley 61
更简洁:
! particular_script
Run Code Online (Sandbox Code Playgroud)
从POSIX规范有关set -e(重点煤矿):
启用此选项时,如果简单命令因Shell错误的后果中列出的任何原因而失败,或者返回退出状态值> 0,并且在while,until或if关键字后面不是复合列表的一部分,并且不是AND或OR列表的一部分,并且不是以!开头的管道!保留字,然后外壳应立即退出.
小智 61
如果您希望脚本在特定命令失败时不停止并且您还想保存失败命令的错误代码,以防万一!
码
set -e
EXIT_CODE=0
command || EXIT_CODE=$?
echo $EXIT_CODE
Run Code Online (Sandbox Code Playgroud)
Tim*_*imo 38
您也可以使用"noop"或null实用程序(如POSIX规范中所述):而不是"不执行任何操作",而不是"返回true ".你会节省几封信.:)
#!/usr/bin/env bash
set -e
man nonexistentghing || :
echo "It's ok.."
Run Code Online (Sandbox Code Playgroud)
Kon*_*ard 24
我找到了另一种方法来解决这个问题:
set +e
find "./csharp/Platform.$REPOSITORY_NAME/obj" -type f -iname "*.cs" -delete
find "./csharp/Platform.$REPOSITORY_NAME.Tests/obj" -type f -iname "*.cs" -delete
set -e
Run Code Online (Sandbox Code Playgroud)
您可以关闭错误失败功能,set +e现在将忽略该行之后的所有错误。完成后,如果您希望脚本因任何错误而再次失败,则可以使用set -e.
应用后,当找不到文件时,整个脚本不会再失败set +e。find同时,find仍然打印错误消息,但整个脚本继续执行。因此,如果这导致了问题,则很容易调试。
这对于 CI 和 CD 很有用(例如在 GitHub Actions 中)。
小智 17
感谢上面提供的简单解决方案:
<particular_script/command> || true
Run Code Online (Sandbox Code Playgroud)
以下构造可用于脚本步骤的其他操作/故障排除和其他流程控制选项:
if <particular_script/command>
then
echo "<particular_script/command> is fine!"
else
echo "<particular_script/command> failed!"
#exit 1
fi
Run Code Online (Sandbox Code Playgroud)
如果需要的话,我们可以停止进一步的行动exit 1。
如果您想防止脚本失败并收集返回码:
command () {
return 1 # or 0 for success
}
set -e
command && returncode=$? || returncode=$?
echo $returncode
Run Code Online (Sandbox Code Playgroud)
returncode 无论命令成功还是失败,都会被收集。
小智 6
output=$(*command* 2>&1) && exit_status=$? || exit_status=$?
echo $output
echo $exit_status
Run Code Online (Sandbox Code Playgroud)
使用它创建日志文件的示例
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
Run Code Online (Sandbox Code Playgroud)