如何在bash脚本中启用或禁用多个“echo语句”

时间:2011-05-12 01:44:17

标签: linux bash

我有bash脚本,在每个命令显示正在发生的事情之前我都有回声。

但是我需要在设置为cron作业时抛弃echo,然后再进行一次测试。

我发现很难去每一行,然后添加/删除评论

有什么我可以包括在顶部的东西像

enable echo or disable echo

这样我就不必浪费时间了

7 个答案:

答案 0 :(得分:14)

绝对最简单的方法是在hashbang行之后插入以下行:

echo() { :; }

如果要重新启用,请删除该行或将其注释掉:

#echo() { :; }

如果你没有使用echoprintf,则使用相同的策略,即:

printf() { :; }

如果绝对需要实际上回显/打印某些内容,请在builtin语句前添加,例如:

builtin echo "This 'echo' will not be suppressed."

这意味着您可以进行条件输出,例如:

echo () {
  [[ "$SOME_KIND_OF_FLAG" ]] && builtin echo $@
}

SOME_KIND_OF_FLAG变量设置为非空值,被覆盖的echo函数的行为与普通echo相同。


编辑: 另一种方法是使用echo进行检测(调试),并使用printf输出(例如,用于管道目的)。这样,就不需要任何FLAG。只需根据您是否想要仪器来禁用/启用echo() { :; }行。


通过CLI参数启用/禁用

将这些行放在hashbang行之后:

if [[ debug == "$1" ]]; then
  INSTRUMENTING=yes  # any non-null will do
  shift
fi
echo () {
  [[ "$INSTRUMENTING" ]] && builtin echo $@
}

现在,调用这样的脚本:script.sh debug将打开仪器。因为有shift命令,您仍然可以提供参数。 E.g:

  • 没有工具:script.sh param1 param2
  • 使用工具:script.sh debug param1 param2

上述可以简化为:

if [[ debug != "$1" ]]; then
  echo () { :; }
  shift
fi

如果您需要检测标志(例如,如果调试将记录输出记录到临时文件 ),请使用else - 块:

if [[ debug != "$1" ]]; then
  echo () { :; }
  shift
else
    INSTRUMENTING=yes
fi

记住:在非调试模式下,所有 echo命令被禁用;您必须使用builtin echoprintf。我推荐后者。

答案 1 :(得分:8)

有几件事:

不要使用echo

而是使用set -xv设置调试模式,它将回显每个命令。您可以将PS4设置为所需的提示:例如PS4='$LINENO: '将打印每行的行号。在BASH,我相信它是一样的。然后,您不必清理脚本。要关闭,请使用set +xv

实施例:          富= 7     条= 7     PS4 ='$ LINENO:'     set -xv #Begin debugging     如果[$ foo = $ bar]     然后         回声“foo肯定是等于吧”     网络

set +xv   #Debugging is off

if [ $bar = $foo ]
then
    echo "And bar also equals foo"
fi

结果:

    $ myprog.sh     如果[$ foo = $ bar]     然后         回声“foo肯定是等于吧”     网络

5: [ 7 = 7 ]
7: echo 'foo certainly does equal bar'
foo certainly does equal bar
set +xv   #Debugging is off

And bar also equals foo

使用功能

定义函数而不是使用echo:

示例:

    功能myecho {         如果[! -z“$ DEBUG”]         然后             回声“$ *”         科幻     }

    DEBUG = “TRUE”     我的回声“将打印出这条线”     未设置DEBUG     myecho“但不会打印出这一行”

使用 nop 命令

冒号(:)是BASH中的nop命令。它没有做任何事情。使用环境变量并将其定义为 echo 。设置为冒号时,没有任何反应。设置为echo时,行打印。

示例:

    回声= “:”     $ echo“此行不会打印”     回声=“回声”     $ echo“但这一行会。”

答案 2 :(得分:2)

基于马修的答案,如何做到这样:

myEcho = "/bin/true"
if [ ! "$CRON" ]: then
    myEcho = "/bin/echo"
fi

然后在您的脚本中使用$myEcho而不是echo

答案 3 :(得分:1)

你可以做得更好。如果按another answer中的详细说明设置crontab,则可以检查是否在cron中运行,如果不是,则仅打印。这样,您就不需要在不同的运行之间修改脚本。

然后你应该可以使用这样的东西(可能不太合适,我不精通bash):

if [ ! "$CRON" ]; then
  echo "Blah blah"
fi

答案 4 :(得分:1)

在顶部尝试set -v以回显每个命令。要停止回显,请将其更改为set +v

答案 5 :(得分:0)

如果你在cron中运行它,为什么不直接转储输出呢?更改您的crontab条目,使其在命令末尾有> /dev/null,并且所有输出都将被忽略。

答案 6 :(得分:0)

不确定我是否错过了以下解决方案,以便在bash脚本的开头使用变量(例如debug)。

设置debug = true后,任何condition-if都会在bash脚本中启用或禁用多个“echo语句”。

 typeset debug=false # set to true if need to debug
...
 if [ $debug == "true" ]; then
     echo
     echo "Filter"
     read
 fi
...
 if [ $debug == "true" ]; then
     echo
     echo "to run awk"
 fi