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

Ger*_*rez 7 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:drop
echo "************************************************************"
echo ""

echo "Setting up the test database"
RAILS_ENV=test bundle exec rake db:setup
echo "************************************************************"
echo ""
Run Code Online (Sandbox Code Playgroud)

输出如下:

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
Run Code Online (Sandbox Code Playgroud)

如您所见,它打印出所有命令,包括echo命令,我不想看到它.

你有什么想法?

干杯,

赫拉尔

123*_*123 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 ""
Run Code Online (Sandbox Code Playgroud)

每次命令后都会执行调试.
$ BASH_COMMAND目前正在运行命令.

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

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


Noa*_*nos 5

谢谢@123!

要从 DEBUG 陷阱中过滤多个字符串(不仅仅是 echo 命令),我们也可以使用正则表达式匹配。

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

trap '! [[ "$BASH_COMMAND" =~ ^(echo|read|if) ]] && echo $PS4$BASH_COMMAND' DEBUG
Run Code Online (Sandbox Code Playgroud)

更新:

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

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

  • @abhiarora,请注意两件事: ^ 字符意味着它将仅查找行的开头,因此如果回显不在行的开头,它将打印它。另请注意 \ 字符,仅当您在 bach 脚本中中断长行时才需要它,因此如果您对此脚本不使用多行,请将其删除。 (2认同)