Echo some command lines in a shell script (echo on for single command)
在shell脚本中,出于状态和调试原因,我想回送一些主要(长时间运行)命令。我知道我可以使用
我可以这样做,但这很难看,也与
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中运行命令,因此
使用这个函数怎么样?
1 2 3 4 5 6 7 | runtraced() { echo"$@" "$@" } dosomething runtraced dosomethingelse |
根据乔纳森莱弗勒的回答,这是同样的方法,只是更清楚一点,因为在命令之后没有什么需要。但您需要指定应该使用哪个shell。这是sh的一个例子:
1 | sh -xc ls $dir |
一个简单的方法是使用
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脚本中定义,我更详细地描述了这一点的方式和原因。在堆栈交换中,我非常详细地讨论了如何使用
-迈克