2

首先,对不起我的英语不好。

我想启用带有日期的调试模式。我在考虑使用一种重定向或另一种重定向的变量,如下所示:

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

但它对我不起作用....怎么能做到这一点¿?¿?

4

3 回答 3

1

我不太清楚“调试模式”是什么意思,但是如果您只想在定义特定变量时打印附加输出,您可以执行以下操作:

#!/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 和调试输出重定向到不同的文件。

于 2013-09-18T19:42:49.327 回答
0

你的问题很难理解,但也许你正在寻找这样的东西?

debug () {
    date +"[%C] $*" >&2
}

if ... whatever ...; then
    dbg=debug
else
    dbg=:
fi

$dbg "script started"
:

无论您想在哪里输出诊断信息,请使用$dbg而不是echo.

(您必须将调试打印中的任何文字百分号加倍,或者使函数稍微复杂一些。)

于 2013-09-18T19:42:41.293 回答
0

您可以为此使用备用文件描述符(以及其他一些修复):

if [[ "${CHAMAC_DEBUG}" == "1" ]]
then
  exec 3>> ~/output.log
else
  exec 3>> /dev/null
fi

{ echo "$(date) : hi, im a echo"; } >&3

进程替换语法想要查看程序的名称,而不是bashwhile. 你也许可以使用类似的东西让它工作>(bash -c 'some stuff here'),但我认为上面更简单。唯一的缺点是您必须自己进行日期标记...如果这是一个问题,您可以考虑将调试消息提交到syslog(通过logger)并将其配置为将这些特定消息转储到自己的文件中...

于 2013-09-18T19:55:55.223 回答