gpt4 book ai didi

sh - 保留 $?

转载 作者:行者123 更新时间:2023-12-03 09:35:44 32 4
gpt4 key购买 nike

仅使用POSIX shell 的特性,是否有一个“简单命令”,它什么也不做,也不改变$? 的值。人们通常描述:作为 shell 的无操作命令,但这总是设置 $?为零,所以这不是我想要的。
这是生成 shell 脚本的程序所需要的。在几个地方它需要发出一个 if-then-else 块

if CONDITION
then
TRUE-COMMANDS
else
FALSE-COMMANDS
fi
但是,由于我现在不想尝试解释的进一步复杂性,它无法可靠地判断 TRUE-COMMANDSFALSE-COMMANDS是空的。空的 then 或 else 子句将是 shell 语法错误。 :可以放在 then的开头-条款照顾 TRUE-COMMANDS为空,但这不适用于 FALSE-COMMANDS因为它破坏了 $?FALSE-COMMANDS可能想查看值 $?由条件设置为。出于同样的原因, :不能放在后面 FALSE-COMMANDS ——if-then-else 后面的代码可能想看 $?从 if-then-else 中的最后一个操作开始。
可以避免的奖励积分:
  • fork :(exit $?)可以完成这项工作,但是在生成的脚本中有很多这样的条件块,它会产生可测量的减速。
  • 函数:给定 nop () { return $? }然后 nop做这项工作,但由于更多的复杂性,我宁愿不参与,拥有 nop 是不切实际的。足够早地为所有需要它的地方定义。
  • 最佳答案

    最简单的方法是使用简单的赋值。而不是使用 : , 做 _rc=$? .

    if condition; then
    [ list-true ] # optional
    _rc=$?
    else
    [ list-false ] # optional
    _rc=$?
    fi
    ( exit $_rc ) # optional
    list-post-if
    使用这个变量 _rc ,你已经存储了上次执行命令的退出状态,是否是 conditionlist-true 中的最后一个命令或 list-false .
  • 支持这种方法的论据是赋值的低开销。
  • 反对的论点是至少需要重写 list-post-if使用 _rc而不是 $? .
  • 如果后者是不可能的,或者太乏味,你可能会考虑添加一个 (exit $_rc)就在条件语句之后。然而,这需要一个子 shell ,但它只是一个。
  • 关于sh - 保留 $?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64788944/

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