例如,我有一个简单的 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 xtrace
和set +o xtrace
是你的朋友(它比 更详细,-o verbose
并且输出转到 STDERR,而不是详细,后者似乎记录到STDOUT)。
查看更多提示这里