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