首先,抱歉我的英语不好。
我想用日期来调试调试模式。我正在考虑使用一种类型的重定向的变量,或者另一种,如下所示:
#!/bin/bash
DEBUG_MODE=1
if [ $CHAMAC_DEBUG = 0 ]; then
output=/dev/null
elif [ $CHAMAC_DEBUG = 1 ]; then
output=>( while read line; do echo "$(date): ${line}"; done >> ~/output.log )
fi
echo "hi, im a echo" &> $output
但它对我不起作用......怎么做呢?¿?
答案 0 :(得分:0)
您的问题很难理解,但也许您正在寻找类似的东西?
debug () {
date +"[%C] $*" >&2
}
if ... whatever ...; then
dbg=debug
else
dbg=:
fi
$dbg "script started"
:
无论您想要输出诊断信息,请使用$dbg
代替echo
。
(您必须在调试打印中加倍任何文字百分号,或使函数稍微复杂一点。)
答案 1 :(得分:0)
我不太确定“调试模式”是什么意思,但是如果你想在定义特定变量时打印额外的输出,你可以这样做:
#!/bin/bash
function print_debug {
[ $DEBUG_MODE -eq 1 ] && echo "$(date) $1"
}
DEBUG_MODE=0
print_debug "Test 1"
DEBUG_MODE=1
print_debug "Test 2"
输出:
$ ./test.sh
Test 2
您还可以通过将调试消息回显到不同的文件描述符来将调试输出与常规输出分开:
function print_debug {
[ $DEBUG_MODE -eq 1 ] && echo "$1" 1>&3
}
这样,如果需要,您可以将STDOUT,STDERR和调试输出重定向到不同的文件。
答案 2 :(得分:0)
您可以使用备用文件描述符(以及一些其他修复程序):
if [[ "${CHAMAC_DEBUG}" == "1" ]]
then
exec 3>> ~/output.log
else
exec 3>> /dev/null
fi
{ echo "$(date) : hi, im a echo"; } >&3
进程替换语法要查看程序的名称,而不是bash
内部命令,如while
。你可以使用像>(bash -c 'some stuff here')
这样的东西让它工作,但我认为上面的内容更简单。唯一的缺点是你必须自己做日期标记...如果这是一个问题,你可以考虑将调试消息提交到syslog
(通过logger
)并配置转储那些特定的消息在他们自己的文件中......