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

Epe*_*ius 95 scripting bash debugging

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

#!/bin/bash
cd ~/hello
ls
Run Code Online (Sandbox Code Playgroud)

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

小智 122

bash -x script
Run Code Online (Sandbox Code Playgroud)

或者

set -x
Run Code Online (Sandbox Code Playgroud)

在脚本中。

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

  • 通过设置`PS4`你可以调整`-x`的提示。例如:`PS4='Line $LINENO @ $(date +%s.%N): ' bash -x script`(不过,`date` 会减慢速度) (3认同)

Den*_*son 24

这些也有效:

set -v
Run Code Online (Sandbox Code Playgroud)

或者

#!/bin/bash -v
Run Code Online (Sandbox Code Playgroud)

但是 -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
Run Code Online (Sandbox Code Playgroud)

这是带有 -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
Run Code Online (Sandbox Code Playgroud)

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


小智 10

这也应该有效:

#!/bin/bash -x
cd ~/hello
ls
Run Code Online (Sandbox Code Playgroud)


spl*_*tne 7

这应该有效:

set -o verbose #echo on
...
set +o verbose #echo off
Run Code Online (Sandbox Code Playgroud)


小智 5

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

在此处查看更多提示