这会隐藏第一个命令的输出,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
这将打印糟糕如果脚本上的任何命令失败,则立即退出。