( set -x ) 模式下的 Bash 脚本不显示“cat”命令的功能。 (其内容)

( set -x ) 模式下的 Bash 脚本不显示“cat”命令的功能。 (其内容)

在这个 bash 脚本中..它只是显示..

    +cat

当它运行时。

#!/bin/bash
set -x
cat > /test << "EOF"
a
b
c
d
EOF

但我宁愿展示它所做的一切。包括

a
b
c
d

它添加到文件中。

答案1

尝试使用set -v而不是set -x

答案2

发生这种情况是因为set -x显示扩展的评估 - 这不是典型重定向的因素。

LC_ALL=C man set |
sed -n '/^ *-x/,/^$/p'

   -x    The  shell  shall  write  to standard error a
         trace for each command after it  expands  the
         command  and  before  it  executes  it. It is
         unspecified whether the  command  that  turns
         tracing off is traced.

来自POSIX 规范

重定向运算符<<<<-都允许重定向 shell 输入文件中包含的行,称为此处文档,到命令的输入。

正是cat它接收输入,而不是 shell。所以没有扩张以便它在执行前报告。而且,在它交出那部分输入后,实际上就没有数据可供报告了。

这就是为什么 - 正如其他地方所建议的那样,set -v确实有效,但-x不起作用:

LC_ALL=C man set |
sed -n '/^ *-v/,/^$/p'

   -v    The shell shall write its input  to  standard
         error as it is read.

在这种情况下,它会在读取时复制其输入stderr- 在重定向之前 - 无论是否扩展它。

答案3

shell 中没有功能支持此操作。你可以实现这个目标具体的做的结果

tee /test << "EOF"
a
b
c
d
EOF

但这并不能完全适应您在 shell 脚本中可以执行的所有操作。

您可能想研究诸如screen和 之类的程序Expect

相关内容