我有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() { :; }根据您是否需要仪器来禁用/启用该行.
将这些行放在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 param2script.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 echo或printf.我推荐后者.
几件事:
而是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"但不会打印出这条线"
冒号(:)是BASH中的nop命令.它没有做任何事情.使用环境变量并将其定义为echo或: . 设置为冒号时,没有任何反应.设置echo为时,行打印.
例:
echo =":"$ echo"这行不会打印"echo ="echo"$ echo"但是这行会."
| 归档时间: |
|
| 查看次数: |
12918 次 |
| 最近记录: |