【问题标题】:is there a clean, concise way to push/pop bash verbose and xtrace options for a funtion?是否有一种简洁、简洁的方法来推送/弹出 bash 详细和 xtrace 选项的功能?
【发布时间】:2019-08-24 02:48:37
【问题描述】:

(Linux bash 4.1.2) 我有一个 bash 函数调用另一个函数。低级函数希望设置 -xv 以进行调试,但我不希望它与父函数中 x 和 v 的值混淆。 IE。我希望子函数推送-xv,然后在返回时恢复以前的设置。例如:

function outer(){ echo starting; inner; echo done; }
function inner(){
    set -xv
    echo inside
    set +xv
  }
outer

如果外部设置为默认设置,则此方法有效;否则它将强制 +xv 在外部代码的其余部分中。我可以想象一些非常混乱的脚本来解析 BASHOPTS,但似乎应该有更好的方法?

【问题讨论】:

    标签: bash function verbose


    【解决方案1】:

    如果您不需要共享外部代码的环境或在inside 中修改来自outside 的变量,您可以使用( inner ) 启动子进程

    function outer(){ echo starting; inner; echo done; }
    function inner(){
        (
            set -xv
            echo inside
        )
    }
    outer
    

    请注意,由于您是在子 shell 中执行,因此无需取消设置 x 和 v。

    您也可以简单地将对内部的调用包装在外部而不修改内部:

    function outer(){ echo starting; ( inner ); echo done; }
    

    您可以在此处找到有关子shell 和变量范围的更多信息。 https://www.tldp.org/LDP/abs/html/subshells.html

    【讨论】:

      【解决方案2】:
      本地保存=$-;设置-x ... 设置 +x -$保存

      【讨论】:

      • 如果save 包含像i 这样的只读选项,这将不起作用。
      • 在 shell 脚本中,“-i”已从 $- 中删除。
      • i 不是唯一有问题的字符。
      猜你喜欢
      • 1970-01-01
      • 2019-01-27
      • 2023-04-04
      • 1970-01-01
      • 2021-11-06
      • 2011-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多