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

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

#!/bin/bash cd ~/hello ls 

在执行它之前,我怎样才能让它显示每一个命令? 只是在Windows批处理脚本中的“@echo off”的相反效果。

 bash -x script 

要么

 set -x 

在脚本中。

您可以使用set +x再次取消选项。 如果你只是想做几个命令,你可以使用一个子shell:`(set -x; command1; command; …;)

这些也工作:

 set -v 

要么

 #!/bin/bash -v 

但-v不会在每个脚本行之前打印PS4string,并且不会单独跟踪“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 

请注意,我join了“echo -n”来强调-v和-x之间的区别。 另外,-v和“-o verbose”是一样的,但是后者似乎不能作为shebang的一部分。

这也应该工作:

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

这应该工作:

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

set -o xtraceset +o xtrace是你的朋友(它比-o verbose更详细,输出到STDERR,而不是verbose,这似乎logging到STDOUT)。

在这里查看更多提示

有几种方法。

 #!/usr/bin/env bash -x 

作为shebang线。

在脚本中包含set -x将启用该function,而set +x将禁用该function。 这两种方法也将使用更便携的sh shell。

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

喜欢

 language -x script 

language = python,perl,bash -x =运算符脚本=文件名

希望它有帮助。

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