Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何启用或禁用多个“;“回声声明”;在bash ecript中_Linux_Bash - Fatal编程技术网

Linux 如何启用或禁用多个“;“回声声明”;在bash ecript中

Linux 如何启用或禁用多个“;“回声声明”;在bash ecript中,linux,bash,Linux,Bash,我有bash脚本,在每个命令之前都有echo来显示正在发生的事情 但我需要在设置为cron作业时解除echo,然后在执行一些测试时再次启用 我发现很难找到每一行,然后添加/删除评论 有什么我可以包括在顶部的东西吗 enable echo or disable echo 这样我就不用浪费时间了,你可以做得更好。如果按照中的详细说明设置crontab,则可以检查是否在cron中运行,如果没有,则仅打印。这样,在不同的运行之间根本不需要修改脚本 然后,您应该能够使用类似的东西(可能不太管用,我不太精

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

但我需要在设置为cron作业时解除echo,然后在执行一些测试时再次启用

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

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

enable echo or disable echo

这样我就不用浪费时间了,你可以做得更好。如果按照中的详细说明设置crontab,则可以检查是否在cron中运行,如果没有,则仅打印。这样,在不同的运行之间根本不需要修改脚本

然后,您应该能够使用类似的东西(可能不太管用,我不太精通
bash
):


尝试在顶部设置-v以回显每个命令。若要停止回音,请根据Matthew的答案将其更改为
set+v

,这样如何:

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

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

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

以下几点:

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

例如:

结果:

$myprog.sh
如果[$foo=$bar]
然后
echo“foo当然会做相同的事”
fi
5: [ 7 = 7 ]
7:echo“foo当然等于bar”
福当然和酒吧一样
set+xv#调试已关闭
巴也等于福
使用函数 定义函数而不是使用echo:

例如:

函数myecho{
如果[!-z“$DEBUG”]
然后
回音“$*”
fi
}
DEBUG=“TRUE”
我的echo“将打印这行”
取消调试
myecho“但不会打印这行”
使用nop命令 冒号(:)是BASH中的nop命令。它没有任何作用。使用环境变量并将其定义为echo或:。设置为冒号时,不会发生任何事情。当设置为
echo
时,该行将打印

例如:

echo=“:”
$echo“此行无法打印”
echo=“echo”
$echo“但这行会。”

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

echo() { :; }
if [[ debug == "$1" ]]; then
  INSTRUMENTING=yes  # any non-null will do
  shift
fi
echo () {
  [[ "$INSTRUMENTING" ]] && builtin echo $@
}
如果要重新启用,请删除该行或将其注释掉:

#echo() { :; }
如果您使用的不是echo,而是printf,则使用相同的策略,即:

printf() { :; }
如果您确实需要回显/打印某些内容,请在
内置语句前加上前缀,例如:

builtin echo "This 'echo' will not be suppressed."
这意味着您可以进行条件输出,例如:

echo () {
  [[ "$SOME_KIND_OF_FLAG" ]] && builtin echo $@
}
SOME\u KIND\u OF \u FLAG
变量设置为非空值,被覆盖的
echo
函数将像普通
echo
一样工作


编辑:另一种选择是使用
echo
进行检测(调试),并使用
printf
进行输出(例如,用于管道)。这样,就不需要任何
标志
。只需分别根据是否要插入指令来禁用/启用
echo(){:;}


通过CLI参数启用/禁用 将这些行放在hashbang行之后:

echo() { :; }
if [[ debug == "$1" ]]; then
  INSTRUMENTING=yes  # any non-null will do
  shift
fi
echo () {
  [[ "$INSTRUMENTING" ]] && builtin echo $@
}
现在,像这样调用脚本:
script.shdebug
将打开检测。由于有
shift
命令,您仍然可以输入参数。例如:

  • 不插入指令:
    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
命令都被禁用;您必须使用
内置echo
printf
。我建议使用后者。

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

 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
设置debug=true后,任何条件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

是的,但是如果他有很多回音语句,把它们都放在一个警卫
中可能有点烦人,如果那样的话。@QuantumMechanical:这是一次性的工作,那么就完成了。胜过每次运行脚本时都更改脚本,因为他已经对每个echo进行了注释。或者,您可以使用别名,然后它甚至不是变量(您可以使用别名echo本身)。这不是有效的bash语法。您需要在
=
符号周围没有空格(如果有空格,将被解释为执行命令
myEcho
,并将
=
作为其第一个参数),并且在
if
then
之间使用分号或换行符,而不是冒号。我尝试了一下,但出现了一些错误,我有类似于
echo“Backing up…”“$FOLDER/$DATE
的语句。那条线有什么问题吗problem@Mahakaal我只是测试了一下,没有出错。但是再一次,你应该把
$FOLDER/$DATE
放在引号里,也就是说:
备份…$FOLDER/$DATE”
我试着在hashbang下面添加那一行,然后我在没有任何echo语句的情况下进行测试,我仍然得到错误,它说
文件的意外结尾
@Mahakaal。。。omigosh,我刚刚意识到:应该是
而不仅仅是
。我一直在测试“条件输出”一个。我会修正我的答案。很抱歉疏忽了。哇,这很好,这就是答案