使用 || 运算符并退出时如何隐藏第一个命令的输出?

使用 || 运算符并退出时如何隐藏第一个命令的输出?

这会隐藏第一个命令的输出,Oops如果失败则打印到 stderr。到目前为止一切顺利。

#!/usr/bin/env bash
invalid_command > /dev/null 2>&1 || >&2 echo "Oops"
echo hi

输出如下内容:

Oops
hi

但是如果第一个命令失败,我需要退出并打印一条消息。所以我尝试使用括号。

#!/usr/bin/env bash
invalid_command > /dev/null 2>&1 || ( >&2 echo "Oops" ; exit )
echo hi

输出结果如下:

Oops
hi

但是现在exit不起作用了,因为它是在子 shell 中执行的,导致它打印hi,尽管我希望脚本退出。

echo那么,如果使用运算符执行特定命令失败,如何让 Bash 转到某些文本并退出||?我知道我可以使用一行代码来执行此操作,但如果可以避免,if我宁愿不必使用完整的语句。if

#!/usr/bin/env bash
if [ "$(invalid_command > /dev/null 2>&1 ; printf $?)" != "0" ]; then >&2 echo 'Oops' ; exit 1; fi

答案1

使用命令分组(请注意;末尾的exit)。

#!/usr/bin/env bash
invalid_command > /dev/null 2>&1 || { >&2 echo "Oops" ; exit; }
echo hi

将其返回到我的终端。

$ ./test.sh 
Oops

如果您有很多命令,您可以捕获所有错误。

#!/usr/bin/env bash
on_error() {
    >&2 echo "Oops"
    exit 1
}
trap 'on_error' ERR
invalid_command > /dev/null 2>&1
echo hi

这将打印糟糕如果脚本上的任何命令失败,则立即退出。

相关内容