脚本
#!/bin/bash
set -v
echo "verbose echo"
{ set +v; } &>/dev/null
echo "non verbose echo"
输出结果如下:
echo "verbose echo"
verbose echo
{ set +v; } &>/dev/null
non verbose echo
我想抑制输出{ set +v; } &>/dev/null
并得到以下输出:
echo "verbose echo"
verbose echo
non verbose echo
我尝试了上面描述的方法,该方法用于使用命令抑制禁用xtrace
( x
) 标志的输出{ set +x; } &>/dev/null
,并且该方法适用于此标志。在和的xtrace
手册中未找到相关信息。bash
set
可以通过子 shell 调用(如下所示)来解决此问题。但是,如果不使用子 shell,这可能吗?
set(1p) 的 POSIX 描述指出:
v
由于下一个命令的重定向 stdout/stderr 的命令构成了对 shell 的“输入”,恐怕如果不至少输出重定向 stderr 本身的命令(或set -v
在子 shell 中使用),就无法重置该选项,即:给出:
虽然满足了不使用子 shell 和不输出 set(1p) 调用本身的要求,但这种重定向有一个缺点,即后续到 stderr 的输出也将被重定向到/dev/null,除非再次重定向到 stdin 或类似的东西。
x
set(1p) 选项是一个特殊情况。值得注意的是,POSIX 规定如下:而GNU Bash 手册指出:
另外,用 替换 后
&>
,2>
dash(其设计目标是严格遵循 POSIX 的 shell)会遵循 Bash 的这种行为并抑制 的输出{ set +x; } 2>/dev/null
,而例如mksh 则不会这样做: