我有bash脚本,在每个命令显示正在发生的事情之前我都有回声。
但是我需要在设置为cron作业时抛弃echo,然后再进行一次测试。
我发现很难去每一行,然后添加/删除评论
有什么我可以包括在顶部的东西像
enable echo or disable echo
这样我就不必浪费时间了
答案 0 :(得分:14)
绝对最简单的方法是在hashbang行之后插入以下行:
echo() { :; }
如果要重新启用,请删除该行或将其注释掉:
#echo() { :; }
如果你没有使用echo
但printf
,则使用相同的策略,即:
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() { :; }
行。
将这些行放在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 echo
或printf
。我推荐后者。
答案 1 :(得分:8)
有几件事:
而是使用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“但不会打印出这一行”
冒号(:)是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