在shell脚本中回显一些命令行(对于单个命令,回显)

Den*_*Den 21 bash shell echo

在shell脚本中,我想回应一些主要(长时间运行)命令的状态和调试原因.我知道我可以使用set -x或启用所有命令的回显set -v.但我不想看到所有命令(特别是不是echo命令).有没有办法只为一个命令打开回声?

我可以这样做,但那很难看,并且也回应了这一行set +x:

#!/bin/sh

dir=/tmp
echo List $dir

set -x
ls $dir
set +x

echo Done!
Run Code Online (Sandbox Code Playgroud)

有一个更好的方法吗?

Jon*_*ler 26

以每个场合的流程为代价,您可以使用:

(set -x; ls $dir)
Run Code Online (Sandbox Code Playgroud)

这在子shell中运行命令,因此set -x仅影响括号内的内容.您无需编码或查看set +x.当我需要进行选择性跟踪时,我会使用它.

  • 还有,`{set + x; } 2>/dev/null` - 通过[Bash set + x而不打印 - Stack Overflow](http://stackoverflow.com/a/19226038/277826) (6认同)
  • 这种技术唯一出现问题的方法是,要跟踪的命令是否需要设置变量以便在父shell中使用.基本上,子shell不能修改原始shell的变量,因此修改严格地局限于括号内的代码. (4认同)

Jo *_* So 5

使用这个功能怎么样?

runtraced() {
    echo "$@"
    "$@"
}

dosomething
runtraced dosomethingelse
Run Code Online (Sandbox Code Playgroud)