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


87

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

#!/bin/bash
cd ~/hello
ls

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


1
对于那些寻找set选项的人,您可以在此手册页上找到它们。
mkobit

您可以像这样简单地扩展shebang#!/bin/bash -x
sobi3ch

Answers:


109
bash -x script

要么

set -x

在脚本中。

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


我一直以来都用过这个,效果很好。输出看起来比您最初预期的要脏。
Scott Pack

2
通过设置PS4您可以调整的提示-x。例如:PS4='Line $LINENO @ $(date +%s.%N): ' bash -x scriptdate会慢下来,虽然)
瓦尔特Tross

23

这些也可以:

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


很好的解释!无需任何研究,在我看来这两个字母代表Verbose和eXplicit。
Ape-in​​ago

我认为-x更接近eXecute。
史蒂文·帕克斯

10

这也应该起作用:

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

6

这应该工作:

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

4

set -o xtrace并且set +o xtrace是您的朋友(比更加冗长,-o verbose并且输出到STDERR,而不是冗长的日志(似乎登录到STDOUT))。

在这里查看更多提示


3

有几种方法。

#!/usr/bin/env bash -x

作为射帮线。

包括set -x在脚本本身中将启用该功能,而set +x将其禁用。这两种方法也都可以用于更便携的sh shell。

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


1

language -x script

语言= python,perl,bash -x =操作员脚本=文件名

希望能帮助到你。


3
-x有呼应在Python没什么
尤金潘科夫

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.