gpt4 book ai didi

linux - 庆典。设置-e;获取结果代码

转载 作者:太空宇宙 更新时间:2023-11-04 09:38:41 25 4
gpt4 key购买 nike

如果我在 bash 脚本中使用 -e 选项并且代码失败 - 我可以捕获它:

$ set -e; ( false; echo qwe; ) || echo qwe
qwe

但是,当我尝试获取返回码时,我得到:

$ (set -e; ( false; echo qwe; ) || ret=$?; echo asd  )
qwe
asd

为什么会发生这种情况以及如何获得返回码?

版本:

$ bash --version
GNU bash, версия 4.2.37(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.

最佳答案

 set -e; ( false; echo qwe; ) || echo qwe

没有按照您的想法行事:

  • 任何包含命令 列表 (false; echo qwe) 的子 shell (( ... )) 将执行 <该列表中的 em>所有 命令,并根据 last 命令的退出代码决定是否中止子 shell(由于 -e);由于 echo qwe,子 shell 的最后一个命令返回 0 作为其退出代码(表示 成功),子 shell 返回 0 overall,因此 || 的右侧永远不会出现;尝试使用不同的字符串来回显:set -e; (假; echo qwe1;)|| echo qwe2

  • 尝试在 子 shell 中设置一个变量(在本例中为 ret)以便在原始 shell 中访问总是毫无意义的,因为它的范围将是仅限于该子外壳;要从子 shell out 传递值,请使用 stdout output。

为了实现您的目标,忘记 set -e 而是在子 shell 中为每个命令添加后缀 || exit 以便在失败的情况下立即中止;离开子 shell 的退出代码将正确反射(reflect)第一个失败命令的退出代码,或者 0,如果所有命令都成功:

output=$( false || exit; echo qwe || exit )  # capture output from subshell
ret=$? # $? reflects overall success of subshell

关于linux - 庆典。设置-e;获取结果代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23622064/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com