coc*_*mac 5 command-line bash scripts error-handling redirect
这会隐藏第一个命令的输出,Oops如果失败则打印到 stderr。到目前为止,一切都很好。
#!/usr/bin/env bash
invalid_command > /dev/null 2>&1 || >&2 echo "Oops"
echo hi
Run Code Online (Sandbox Code Playgroud)
输出如下:
Oops
hi
Run Code Online (Sandbox Code Playgroud)
但如果第一个命令失败,我需要退出并打印一条消息。所以我尝试使用括号。
Oops
hi
Run Code Online (Sandbox Code Playgroud)
这是它的输出:
Oops
hi
Run Code Online (Sandbox Code Playgroud)
但现在exit不起作用,因为它是在子 shell 中执行的,导致它打印hi,即使我希望脚本退出。
那么,如果使用操作符执行特定命令失败,如何让 Bash 获取echo某些文本并退出||?我知道我可以使用单行语句来做到这一点,但如果可以避免的话,if我宁愿不必使用完整的语句。if
#!/usr/bin/env bash
invalid_command > /dev/null 2>&1 || ( >&2 echo "Oops" ; exit )
echo hi
Run Code Online (Sandbox Code Playgroud)
Lis*_*iso 10
使用命令分组(注意;末尾的exit)。
#!/usr/bin/env bash
invalid_command > /dev/null 2>&1 || { >&2 echo "Oops" ; exit; }
echo hi
Run Code Online (Sandbox Code Playgroud)
在我的终端上返回这个。
$ ./test.sh
Oops
Run Code Online (Sandbox Code Playgroud)
如果你有很多命令,你可以捕获所有错误。
#!/usr/bin/env bash
on_error() {
>&2 echo "Oops"
exit 1
}
trap 'on_error' ERR
invalid_command > /dev/null 2>&1
echo hi
Run Code Online (Sandbox Code Playgroud)
如果脚本上的任何命令失败,这将打印Oops并立即退出。