脚本中的内联调试 (xtrace)

脚本中的内联调试 (xtrace)

有没有办法在脚本中强制启用或禁用每个命令行的调试(xtrace)?

在 Windows Shell(“ms-dos”)中,“@”可以作为命令行前缀,如果启用了回显(可以说调试)(回显打开),则禁用显示该行。

考虑 xtrace on (set -x),但我们可以在某些行中忽略它的效果,并在其前面加上“@”。就像:

set -x
@echo Listing...
ls
set +x

输出示例:

Listing...
+ ls
file1
file2

shell脚本中有类似的东西吗?

答案1

我不知道有任何 shell 有这样的运算符。然而,对于大多数 shell(ksh 是例外),您可以xtrace通过以下方式静默切换:

{
  case $- in
    (*x*) set +x;;
    (*) set -x
  esac
} 2> /dev/null

所以你可以将其设为别名:

alias 'xx={
  case $- in
    (*x*) set +x;;
    (*) set -x
  esac
} 2> /dev/null'

并用作:

set -x
echo traced
xx; echo not traced; xx
echo traced
set +x

请注意,使用 bash,您需要shopt -s expand_aliases在非交互式 shell 中扩展别名(如在脚本中)。

相关内容