等价的“回声”为Linux?


27

我如何获得在bash脚本中运行的所有命令的标准输出?

即输出必须包含命令输出AND命令本身。

我发现

#!/bin/bash -x

但这并不完全相同,因为

 mysql -v dbname < dump.sql | grep "CREATE TABLE"

表明

+ mysql -v dbname
+ grep 'CREATE TABLE'

Answers:


29

使用bash -v

这是脚本:

#!/bin/bash -v

echo "Hello, World" | sed 's|Hello|Goodbye|'

echo "Done."

这是输出:

#!/bin/bash -v

echo "Hello, World" | sed 's|Hello|Goodbye|'
Goodbye, World

echo "Done."
Done.

不幸的是,没有像PS4打印扩展命令那样的特殊标记。您可以将两者结合起来以快速识别命令:

#!/bin/bash -vx

echo "Hello, World" | sed 's|Hello|Goodbye|'
+ echo 'Hello, World'
+ sed 's|Hello|Goodbye|'
Goodbye, World

echo "Done."
+ echo Done.
Done.

12

set -x是另一种方式。

$ cat a.sh
#!/bin/bash

set -x
echo "Hello, World" | sed 's|Hello|Goodbye|'
echo "Done."

输出将是:

sh a.sh
+ echo 'Hello, World'
+ sed 's|Hello|Goodbye|'
Goodbye, World
+ echo Done.
Done.

1
这就是OP在他的问题
丹尼尔·贝克

@Ashok您能解释一下吗?我看不到区别:此处 ps:GNU bash,版本4.1.5(1)-发行版(i486-pc-linux-gnu)Ubuntu 10.04.3
Putnik

1
@Putnik这是相同的基本操作,但是您可以set -x在脚本中的任何位置,甚至可以再次将其停用。因此,如果您只想将它​​放在echo "Done"网上,请放在set -x那之前。
丹尼尔·贝克
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.