我想编写一个打印命令的bash脚本。但出于可读性目的,我不希望它打印echo命令。不幸的是,我找不到正确的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命令,我不想看到它。
你有什么想法吗?
干杯,
了Gerardo
答案 0 :(得分:10)
您可以使用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 当前正在执行或即将执行的命令,除非shell正在执行作为陷阱结果的命令,在这种情况下,它是在陷阱时执行的命令。
因此陷阱只是检查最后一个命令是否没有以echo开头并打印出来。
答案 1 :(得分:1)
感谢@ 123!
要从DEBUG陷阱中过滤多个字符串(而不仅仅是echo命令),我们也可以使用regexp匹配。
例如,要过滤掉以“ echo”,“ read”或“ if”开头的任何命令,我使用:
trap '! [[ "$BASH_COMMAND" =~ ^(echo|read|if) ]] && echo $PS4$BASH_COMMAND' DEBUG
更新:
为了显示bash的 $ {variable} 值,我现在使用:
trap '! [[ "$BASH_COMMAND" =~ ^(echo|read|if) ]] && \
cmd=`eval echo "$BASH_COMMAND" 2>/dev/null` && echo "$cmd"' DEBUG