虽然Bash man page指出:如果失败的命令是......在& &或执行命令的一部分可以找到一种方法来设置-e/ERR子shell捕获对&&和||的免疫性限制吗?
不执行ERR陷阱||列表...
我希望在一个子shell中的代码将在不同的上下文,不会受到上述限制。下面的代码表明,即使子shell都没有不受此限制免疫:
#!/bin/bash
main()
{
local Arg="$1"
(
set -e
echo "In main: $Arg"
trap MyTrap ERR
$(exit 1)
echo "Should not get here"
)
return 1
}
MyTrap()
{
echo "In MyTrap"
}
main 1
[[ $? -eq 0 ]] || echo "failed"
echo
main 2 || echo "failed"
上面的代码具有以下的输出:
In main: 1
In MyTrap
failed
In main: 2
Should not get here
failed
我目前的解决办法是使用文件持久保存错误状态在MyTrap
然后检查返回代码返回在调用者。例如:
MyTrap()
{
echo "_ERROR_=$?" > $HOME/.persist
echo "In MyTrap"
}
main 1
[[ -f $HOME/.persist ]] && . $HOME/.persist || _ERROR_=0
[[ $_ERROR_ -eq 0 ]] || echo "failed"
上述输出现在是:
In main: 1
In MyTrap
failed
所以,问题是:能的方法来发现这样做设置-e/ERR壳层陷阱,不受&&
和||
限制比上述解决方法简单吗?
注:这个问题适用于:
- 击4.2和更高
- 红帽7,CentOS的7,以及相关的发行版(即,不Debian的等)
- 不应该使用第三方软件。软件包必须可用,例如,通过[CentOS-7-x86_64-DVD-1611.iso] [2]存储库ISO中的OS提供程序包(对于RHEL 7,Fedora 7等也是如此)。
如何...不要使用set -e? –
你可能想看看这篇文章:http://stackoverflow.com/questions/41774696/bash-scripting-graceful-function-death-on-error/41774978?noredirect=1#comment70744209_41774978 – codeforester
@gniourf_gniourf请让我知道你的想法会起作用吗? –