如何在bash ecript中启用或禁用多个"echo语句"

Mah*_*aal 2 linux bash

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

但是我需要在设置为cron作业时抛弃回声,然后再次启用,如果做一些测试.

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

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

enable echo or disable echo
Run Code Online (Sandbox Code Playgroud)

这样我就不必浪费时间了

pep*_*uan 14

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

echo() { :; }
Run Code Online (Sandbox Code Playgroud)

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

#echo() { :; }
Run Code Online (Sandbox Code Playgroud)

如果你不使用echo,但是printf,同样的策略,即:

printf() { :; }
Run Code Online (Sandbox Code Playgroud)

如果你绝对需要实际呼应/ printf的东西,前置的builtin语句,如:

builtin echo "This 'echo' will not be suppressed."
Run Code Online (Sandbox Code Playgroud)

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

echo () {
  [[ "$SOME_KIND_OF_FLAG" ]] && builtin echo $@
}
Run Code Online (Sandbox Code Playgroud)

SOME_KIND_OF_FLAG变量设置为非null值,并且重写的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 $@
}
Run Code Online (Sandbox Code Playgroud)

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

  • 没有仪表: script.sh param1 param2
  • 使用仪器: script.sh debug param1 param2

上述可以被简化为:

if [[ debug != "$1" ]]; then
  echo () { :; }
  shift
fi
Run Code Online (Sandbox Code Playgroud)

如果需要 instrumenting标志(例如,在调试时将命令的输出记录到临时文件中),请使用else-block:

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

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


Dav*_* W. 9

几件事:

根本不要使用回声

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

示例:foo = 7 bar = 7 PS4 ='$ LINENO:'set -xv #Begin debugging if [$ foo = $ bar] then echo"foo当然确实等于吧"fi

foo=7
bar=7
PS4='$LINENO: '
set -xv   #Begin debugging
if [ $foo = $bar ]
then
    echo "foo certainly does equal bar"
fi

set +xv   #Debugging is off

if [ $bar = $foo ]
then
    echo "And bar also equals foo"
fi
Run Code Online (Sandbox Code Playgroud)

结果:

$ myprog.sh如果[$ foo = $ bar]那么echo"foo肯定会等于吧"fi

$ myprog.sh
if [ $foo = $bar ]
then
    echo "foo certainly does equal bar"
fi

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

使用功能

定义函数而不是使用echo:

例:

功能myecho {if [!-z"$ DEBUG"]然后回显"$*"fi}

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

使用nop命令

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

例:

echo =":"$ echo"这行不会打印"echo ="echo"$ echo"但是这行会."