Bash忽略特定命令的错误

时间:2012-06-27 17:34:55

标签: linux bash

我正在使用以下选项

set -o pipefail
set -e

在bash脚本中停止执行错误。我有~100行脚本执行,我不想检查脚本中每行的返回码。

但是对于一个特定的命令,我想忽略错误。我怎么能这样做?

12 个答案:

答案 0 :(得分:600)

解决方案:

particular_script || true

示例:

$ cat /tmp/1.sh
particular_script()
{
    false
}

set -e

echo ein
particular_script || true
echo zwei
particular_script
echo drei

$ bash /tmp/1.sh
ein
zwei

drei永远不会打印出来。

此外,我想在pipefail开启时添加, shell认为整个管道的退出代码非零是足够的 当管道中的一个命令具有非零退出代码(关闭pipefail时,它必须是最后一个)。

$ set -o pipefail
$ false | true ; echo $?
1
$ set +o pipefail
$ false | true ; echo $?
0

答案 1 :(得分:145)

只需在要忽略错误的命令后添加|| true

答案 2 :(得分:55)

更简洁:

! particular_script

POSIX specification关于set -e(强调我的):

  

当此选项打开时,如果简单命令因Shell错误的后果中列出的任何原因而失败,或者返回退出状态值> 0,并且在一段时间之后不是复合列表的一部分,直到或if关键字,并且不是AND或OR列表的一部分,并且不是管道前面的!保留字,然后shell应立即退出。

答案 3 :(得分:42)

如果您希望脚本在特定命令失败时不停止并且您还想保存失败命令的错误代码,以防万一:

<强>码

set -e;
command || EXIT_CODE=$? && true ; 
echo $EXIT_CODE

答案 4 :(得分:36)

您也可以使用“noop”或null实用程序(如POSIX specs中所述):而不是“不执行任何操作”,而不是“返回true”。你会节省几封信。 :)

#!/usr/bin/env bash
set -e
man nonexistentghing || :
echo "It's ok.."

答案 5 :(得分:2)

如果要防止脚本失败,请 并收集返回代码:

command () {
    return 1  # or 0 for success
}

set -e

command && returncode=$? || returncode=$?
echo $returncode

returncode不管命令成功还是失败都被收集。

答案 6 :(得分:2)

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

答案 7 :(得分:1)

在使用CLI工具时,我一直在使用下面的代码段,我想知道是否存在某些资源,但是我不在乎输出。

if [ -z "$(cat no_exist 2>&1 >/dev/null)" ]; then
    echo "none exist actually exist!"
fi

答案 8 :(得分:1)

这里没有解决方案对我有用,所以我找到了另一个解决方案:

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

这对于CI和CD很有用。通过这种方式可以打印错误消息,但整个脚本将继续执行。

答案 9 :(得分:0)

虽然|| true是首选,但您也可以

var=$(echo $(exit 1)) # it shouldn't fail

答案 10 :(得分:0)

我有点喜欢这种解决方案:

: `particular_script`

执行反勾号之间的命令/脚本,并将其输出输入到命令“:”(相当于“ true”)

$ false
$ echo $?
1
$ : `false`
$ echo $?
0

编辑:修复了难看的错字

答案 11 :(得分:0)

感谢上面提供的简单解决方案:

<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