将调试模式添加到bash脚本

时间:2013-09-18 19:27:00

标签: bash debugging date redirect

首先,抱歉我的英语不好。

我想用日期来调试调试模式。我正在考虑使用一种类型的重定向的变量,或者另一种,如下所示:

#!/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

但它对我不起作用......怎么做呢?¿?

3 个答案:

答案 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)并配置转储那些特定的消息在他们自己的文件中......