如何让 bash 脚本在执行之前打印出每个命令?

如何让 bash 脚本在执行之前打印出每个命令?

例如,我有一个简单的 bash 文件

#!/bin/bash
cd ~/hello
ls

如何让它在执行每个命令之前显示它?与 Windows 批处理脚本中的“@echo off”效果正好相反。

答案1

bash -x script

或者

set -x

在脚本中。

您可以使用 再次取消设置该选项set +x。如果您只想对几个命令执行此操作,则可以使用子 shell:`(set -x; command1; command; ...;)

答案2

这些也有效:

set -v

或者

#!/bin/bash -v

但是 -v 不会在每行脚本前打印 PS4 字符串,也不会逐个跟踪“for”语句的步骤(例如)。它会回显注释,而 -x 则不会。

以下是使用 -v 的输出示例:

#!/bin/bash -v
# this is a comment
for i in {1..4}
do
    echo -n $i
done
1234echo

echo hello
hello

以下是使用 -x 的同一脚本的结果:

+ for i in '{1..4}'
+ echo -n 1
1+ for i in '{1..4}'
+ echo -n 2
2+ for i in '{1..4}'
+ echo -n 3
3+ for i in '{1..4}'
+ echo -n 4
4+ echo

+ echo hello
hello

请注意,我添加了“echo -n”以强调 -v 和 -x 之间的区别。另外,-v 与“-o verbose”相同,但后者似乎不能作为 shebang 的一部分工作。

答案3

这也应该有效:

#!/bin/bash -x
cd ~/hello
ls

答案4

set -o xtraceset +o xtrace是你的朋友(它比 更详细,-o verbose并且输出转到 STDERR,而不是详细,后者似乎记录到STDOUT)。

查看更多提示这里

相关内容