【问题标题】:Bash script print commands, but do not print echo commandBash 脚本打印命令,但不打印 echo 命令
【发布时间】:2022-01-04 07:53:33
【问题描述】:

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

【问题讨论】:

  • 也许这个?:| grep -v "echo "
  • Makefile 是否适合您的任务?这是一种截然不同的方法,但make 在执行每个命令时默认回显它,除非您在命令前加上@。

标签: bash command-line echo


【解决方案1】:

您可以使用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 开头并打印出来。

【讨论】:

  • Thx 123,效果很好,我会使用它。这是一个有趣的方法,我没有想过。我想知道是否有针对我的问题的特殊选项或设置。
  • @GerardoNavarroSuarez 我不认为有,但如果你找到任何让我知道!
  • 感谢@123。如果我想隐藏其他打印,例如“read -s ...”,该怎么办。我找不到正确的|| && 语法...
  • 哦,不处理||是必需的...这有效:trap '[[ $BASH_COMMAND != echo* ]] && [[ $BASH_COMMAND != read* ]] && echo $BASH_COMMAND' DEBUG
【解决方案2】:

谢谢@123!

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

例如,要过滤掉任何以“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

【讨论】:

  • 您的命令有效,但仍会打印回显消息。我累了trap '! [[ "$BASH_COMMAND" =~ ^(echo|read|if|sleep|confirm_and_exit_on_no|confirm|exit) ]] && \ cmd=`eval echo "$BASH_COMMAND" 2>/dev/null` && echo ---- "$cmd" ----' DEBUG
  • @abhiarora,请注意两点: ^ 字符意味着它将仅查找行首,因此如果 echo 不在行首,它将打印出来。另请注意 \ 字符,仅当您在 bach 脚本中中断长行时才需要它,因此如果您对此脚本不使用多行,请将其删除。
猜你喜欢
  • 1970-01-01
  • 2012-04-04
  • 2020-10-15
  • 1970-01-01
  • 2011-11-13
  • 2020-09-14
  • 2021-05-14
相关资源
最近更新 更多