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


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

#!/bin/bash
cd ~/hello
ls

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


74
2018-05-31 13:39




对于那些寻找什么的人 set 选项是,你可以找到它们 在这个手册页上。 - mkobit
你可以像这样简单地延长shebang #!/bin/bash -x - sobi3ch


答案:


bash -x script

要么

set -x

在脚本中。

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


98
2018-05-31 13:44



我一直用这个效果很好。输出看起来比你想象的要脏一些。 - Scott Pack
通过设置 PS4 你可以调整提示 -x。例如。: PS4='Line $LINENO @ $(date +%s.%N): ' bash -x script (date 但会慢下来 - Walter Tross


这些也有效:

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的一部分。


22
2018-05-31 15:28



很棒的解释!没有做任何研究,它看起来像Verbose和eXplicit是这两个字母所代表的。 - Ape-inago
我认为-x更接近eXecute。 - Steven Parkes


这应该也有效:

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

10
2018-05-31 14:18





这应该工作:

set -o verbose #echo on
...
set +o verbose #echo off

5
2018-05-31 13:44





set -o xtrace 和 set +o xtrace 是你的朋友(它比...更冗长 -o verbose,输出转到STDERR,而不是verbose,它似乎记录到STDOUT)。

查看更多提示 这里


4
2018-06-10 12:45





有几种方法。

#!/usr/bin/env bash -x

作为shebang线。

包含 set -x 在脚本本身将启用功能 set +x 将禁用它。 这两种方法都可以使用更便携的sh shell。

如果我没记错,perl也有-x选项。


3
2018-05-31 19:09





好像

language -x script

language = python,perl,bash -x =运算符 script = filename

希望能帮助到你。


2
2018-05-31 16:12



-x 与Python中的回声无关 - Eugene Pankov


#! /bin/bash -x 做你想要的。


0
2018-06-11 11:16