我有一个简单的脚本,其功能很简单,可能会导致错误。让我们定义这个功能,并让它破碎:
brokenFunction () {
ls "non-existing-folder"
}
如果我们在一个块中执行此函数,检测它是否已损坏,则效果很好:
brokenFunction || printf "It is broken\n"
打印"它被打破"
现在,让我们通过在最后添加一个正确的命令来使函数更复杂:
#!/bin/sh
brokenFunction () {
ls "non-existing-folder"
printf "End of function\n"
}
brokenFunction || printf "It is broken\n"
此脚本打印:
$ ./script.sh
ls: cannot access 'non-existing-folder': No such file or directory
End of function
虽然我希望函数在printf语句之前停止,然后显示下一个块"它已被打破"。
事实上,如果我检查brokenFunction
的退出状态代码,则为0。
我尝试将set -e
添加到脚本的顶部。行为仍然相同,但如果在没有brokenFunction
的情况下调用,则||
的退出代码现在变为2
。如果使用它调用,状态代码仍为0
。
有没有办法将set -e
设置保留在使用||
调用的函数中?
#!/bin/sh
set -e
{
ls "non-existing-dir"
printf "End of block\n"
} || {
printf "It is broken\n"
}
打印
$ ./script.sh
ls: cannot access 'non-existing-dir': No such file or directory
End of block
答案 0 :(得分:0)
如man bash
所述,set -e
在某些情况下会被忽略。 ||
或&&
之前的命令就是这样的背景。
trap
看起来像是一个可行的解决方案。使用trap
的最后一个脚本的替代工作方式如下:
#!/bin/sh
abort () {
printf "It is broken\n"
}
trap 'abort' ERR
(
set -e
false
printf "End of block\n"
)
trap - ERR
有些事情需要注意:
trap 'abort' ERR
将abort
函数绑定到任何引发的错误; set -e
效果)上退出此子shell,而不是整个脚本; trap - ERR
重置trap
绑定,这意味着脚本的以下部分将像以前一样执行。要测试边框效果,我们可以添加以前的非工作部分:
#!/bin/sh
abort () {
printf "It is broken\n"
}
trap 'abort' ERR
(
set -e
false
printf "End of block\n"
)
trap - ERR
{
false
printf "End of second block\n"
} || {
printf "It is broken too\n"
}
打印:
It is broken
End of second block