加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

bash – 陷阱/返回后退出状态在哪里?

发布时间:2020-12-15 16:59:33 所属栏目:安全 来源:网络整理
导读:由于 this question,我一直在使用函数内的陷阱,并提出了这个次要问题.给出以下代码: d() { trap 'return' ERR false echo hi} 如果我运行d,陷阱会导致shell从函数返回而不打
由于 this question,我一直在使用函数内的陷阱,并提出了这个次要问题.给出以下代码:
d() {
    trap 'return' ERR
    false
    echo hi
}

如果我运行d,陷阱会导致shell从函数返回而不打印’hi’.到现在为止还挺好.但如果我第二次运行它,我会收到来自shell的消息:

-bash: return: can only `return’ from a function or sourced script

起初,我认为这意味着ERR sig发生了两次:一旦false给出非零退出状态(在函数内),并且当函数本身返回非零退出状态(函数外)时.但是这个假设并没有阻止这个测试:

e() {
    trap 'echo +;return' ERR
    false
    echo hi
}

如果我运行上面的命令,无论我多久运行一次,我都不再只能从bash的函数或源脚本警告返回.为什么shell处理的复合命令与陷阱arg中的简单命令不同?

我的目标是维护导致函数退出的命令的实际退出状态,但我认为导致上述行为的任何因素也会导致捕获退出状态变得复杂:

f() {
    trap '
        local s=$?
        echo $s
        return $s' ERR
    false
    echo hi
}

bash> f; echo $?
1
0

笏?有人可以解释为什么$s在这里扩展到两个不同的值,如果事实证明是相同的原因,那么返回和回声之间的区别;返回?

你的第一个结论是正确的:ERR sig发生了两次.

在第一次执行’d’期间,您可以全局定义陷阱.这会影响下一个命令(d的当前调用不受影响).
在第二次执行’d’期间,再次定义一个陷阱(不是很有用),’false’的调用失败,所以我们执行陷阱定义的处理程序.然后我们返回父shell,其中’d’也失败了,所以我们再次执行陷阱.

只是一个评论. ERR可以作为’sigspec’参数给出,但ERR不是信号;-)来自BASH的手册:

If a sigspec is ERR,the command arg is executed whenever a sim                        

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读