2015-10-29 181 views
3

我想写一个bash脚本打印命令。但为了便于阅读,我不希望它打印回显命令。不幸的是,我无法找到我的bash脚本的正确设置来实现此目的。我需要帮助?Bash脚本打印命令,但不打印回显命令

#!/bin/bash 

# Makes the bash script to print out every command before it is executed 
set -v 

echo "Cleaning test database" 
RAILS_ENV=test bundle exec rake db:drop 
echo "************************************************************" 
echo "" 

echo "Setting up the test database" 
RAILS_ENV=test bundle exec rake db:setup 
echo "************************************************************" 
echo "" 

输出看起来像:

echo "Cleaning test database" 
Cleaning test database 
RAILS_ENV=test bundle exec rake db:drop 
echo "************************************************************" 
************************************************************ 
echo "" 


echo "Setting up the test database" 
Setting up the test database 
RAILS_ENV=test bundle exec rake db:setup 

正如你可以看到它打印出所有包含echo命令,这是我不想看到的命令。

你有什么想法吗?

干杯,

赫拉尔

+1

也许这吗?:'| | grep -v“echo”' – whoan

+0

Makefile适合你的任务吗?这是一种截然不同的方法,但是'make'会在执行时默认回应每个命令,*除非*前缀为@。 – chepner

回答

6

你可以使用trap DEBUG,而不是作为set -v一个选项。

例如

#!/bin/bash 


# Makes the bash script to print out every command before it is executed except echo 
trap '[[ $BASH_COMMAND != echo* ]] && echo $BASH_COMMAND' DEBUG 

echo "Cleaning test database" 
RAILS_ENV=test bundle exec rake db:drop 
echo "************************************************************" 
echo "" 

echo "Setting up the test database" 
RAILS_ENV=test bundle exec rake db:setup 
echo "************************************************************" 
echo "" 

调试每命令之后被执行。
$ BASH_COMMAND当前正在运行命令。

BASH_COMMAND 当前正在执行或者即将执行,除非外壳执行一个命令作为一个陷阱,在这种情况下,它是在所述捕集器的时间执行该命令的结果的命令。

所以陷阱只是检查最后一个命令是不是以echo开头并打印它。

+1

Thx 123,它工作很好,我会用它。 这是一个我没有想过的有趣的方法。我想知道我的问题是否有特殊的选项或设置。 –

+0

@GerardoNavarroSuarez我不认为有,但如果你发现任何让我知道! – 123