有没有一种简洁明了的方法来 push/pop bash verbose 和 xtrace 选项的功能?

is there a clean, concise way to push/pop bash verbose and xtrace options for a funtion?

(Linux bash 4.1.2) 我有一个 bash 函数调用另一个函数。低级函数想要设置 -xv 进行调试,但我不希望它弄乱父函数中 x 和 v 的值。 IE。我希望子函数按下 -xv,然后在 return 上恢复之前的设置。例如:

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

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

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

启动子进程
function outer(){ echo starting; inner; echo done; }
function inner(){
    (
        set -xv
        echo inside
    )
}
outer

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

你也可以在不修改 inner 的情况下简单地将对 inner 的调用包装在 outer 中:

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

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

  local save=$-; set -x
  ...
  set +x -$save