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

Echo some command lines in a shell script (echo on for single command)

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

我可以这样做,但这很难看,也与set +x这句话相呼应:

1
2
3
4
5
6
7
8
9
10
#!/bin/sh

dir=/tmp
echo List $dir

set -x
ls $dir
set +x

echo Done!

有更好的方法吗?


以每次处理的成本为代价,您可以使用:

1
(set -x; ls $dir)

这在子shell中运行命令,因此set -x只影响括号内的内容。您不需要编写代码或查看set +x。当我需要进行选择性跟踪时,我使用这个。


使用这个函数怎么样?

1
2
3
4
5
6
7
runtraced() {
    echo"$@"
   "$@"
}

dosomething
runtraced dosomethingelse


根据乔纳森莱弗勒的回答,这是同样的方法,只是更清楚一点,因为在命令之后没有什么需要。但您需要指定应该使用哪个shell。这是sh的一个例子:

1
sh -xc ls $dir


一个简单的方法是使用heredoc和一个未解释的字符串。它是可移植的、快速的POSIX:

1
2
3
4
5
6
...
% cmd='ls ${dir}'
% sh -x <<_EOF_
> ${cmd}
> _EOF_
...

您可以用这种方式构建整个脚本,根据需要以编程方式解析和/或修改它们,将它们保存到shell变量并从shell变量调用它们,然后在另一个脚本或shell函数中运行它们:

1
2
3
4
5
6
7
...
% script="$(cat </some/entire/script.sh)"
% script="$(pipeline | processing | on | ${script})"    
% sh -x <<_EOF_ 2>&1 | grep ${specific_cmds_Im_looking_for}
> ${script}
> _EOF_
<desired output>

在我对符合POSIX的方法的回答中,为了查看函数是否在sh脚本中定义,我更详细地描述了这一点的方式和原因。在堆栈交换中,我非常详细地讨论了如何使用heredoc来解决一些令人讨厌的引用问题,以回答函数或脚本中是否有方法获得实际的(未解释的)shell参数?.

-迈克