Bash脚本打印命令,但不打印echo命令

Bash脚本打印命令,但不打印echo命令,bash,command-line,echo,Bash,Command Line,Echo,我想写一个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:dro

我想写一个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命令。

您可以使用
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_命令当前正在运行该命令

BASH_命令 当前正在执行或即将执行的命令,除非shell正在执行作为陷阱结果的命令,在这种情况下,它是陷阱发生时执行的命令

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

谢谢@123

要从调试陷阱中过滤多个字符串(不仅仅是echo命令),我们也可以使用regexp match

例如,要过滤掉以“echo”或“read”或“if”开头的任何命令,我使用:

更新:

为了显示花费的bash${variable}值,我现在使用:

trap '! [[ "$BASH_COMMAND" =~ ^(echo|read|if) ]] && \
cmd=`eval echo "$BASH_COMMAND" 2>/dev/null` && echo "$cmd"' DEBUG

也许是这样?:
| grep-v“echo”
生成文件是否适合您的任务?这是一种完全不同的方法,但是默认情况下,
make
会在执行每个命令时回显它,除非在命令前面加上@.Thx 123,否则它工作得很好,我将使用它。这是一个有趣的方法,我没有想过。我想知道是否有特别的选项或设置来解决我的问题。@GerardoNavarroSuarez我想没有,但是如果你发现了,请告诉我!谢谢@123。如果我想隐藏其他指纹,比如“read-s…”怎么办。我找不到正确的| |&&语法…哦,不需要处理|&。。。这是有效的:
trap'[[$BASH\u COMMAND!=echo*]&&[$BASH\u COMMAND!=read*]&&echo$BASH\u COMMAND'DEBUG
。我累了
trap'![[“$BASH_COMMAND”=~^(echo | read | if | sleep | confirm|u和| exit | on | no | confirm | exit)]&&\cmd eval echo“$BASH| COMMAND”2>/dev/null`&&echo-->$cmd DEBUG
@abhiara,注意两件事:^char表示它将只查找行的开头,因此如果echo不在行的开头,它将打印它。还要注意\char,只有在bach脚本中打断一条长线时才需要它,因此如果不使用多行脚本,请将其删除。
trap '! [[ "$BASH_COMMAND" =~ ^(echo|read|if) ]] && \
cmd=`eval echo "$BASH_COMMAND" 2>/dev/null` && echo "$cmd"' DEBUG