2017-06-11 41 views
0

这是对In a shell script: echo shell commands as they are executed问题的扩展。因此,我们通过使用set -v(对于扩展之前的详细信息)或set -x(对于xtrace,在扩展之后)使用我们的命令行echo'd;或两个set -vx。大。在shell脚本中:在执行echo命令时重定向它们

我的问题是:我们如何重定向这些echo'd行(例如文件)?

如果我运行下面的线,

BLA='xyz' 
set -v 
echo $BLA > bla.log 

,显然,bla.log将包含 'xyz',而不是回声 'echo $BLA > bla.log'。

我显然需要更好地了解shell,以了解这里发生了什么;除了'howto redirect'解决方案之外,还将非常感谢更深入的解释。

由于

回答

2

要将X跟踪输出发送到的地方不是标准错误一样,您可以设置BASH_XTRACEFD到一个打开的文件描述符的数量。例如。这将直接X跟踪输出到一个名为xtrace文件:

$ exec 19>xtrace; BASH_XTRACEFD=19; set -x 

(我把19的帽子,你可以使用任何FD号,只要它不是用来做别的事情)

+1

在'庆典'4.1或更高版本,您可以让shell为您选择一个未使用的描述符:'exec {foo}> xtrace; BASH_XTRACEFD = $ foo的;设置-x'。从'bash' 4.3开始,你可以缩短到'exec {BASH_XTRACEFD}> xtrace;设置-x'。 (无论如何,'BASH_XTRACEFD'需要4.1。) – chepner

1

文本打印成的set -xset -v结果被写入到stderr。如果你希望所有的输出为bla.log,只是做:

exec > bla.log 2>&1 
set -v 
echo bla