是否有一种干净,简洁的方式来推送/弹出bash verbose和xtrace选项以获得功能?

问题描述 投票:0回答:2

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

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

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

bash function push pop verbose
2个回答
3
投票

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

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

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

您也可以简单地将调用包装到inner in outer而不修改inner:

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

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


0
投票
  local save=$-; set -x
  ...
  set +x -$save
© www.soinside.com 2019 - 2024. All rights reserved.