为什么空值会有纪元时间?

Why there is an epoch time from empty value?

我正在尝试改进读取日志文件并在应用程序已停止 运行 和日志记录时发送通知的监视器。为了避免在日志文件轮换且应用程序未记录任何内容时收到通知,我添加了一个检查以查看最旧的日志行是否超过两分钟。

这是重要部分的片段。

<bash lines and variable setting>
LATEST=$(gawk 'match([=10=], /\[#\|(.*[0-9]*?)T(.*[0-9]*?)\+.*<AppToMonitor>/, m) {print m[1], m[2];} ' $LOG_TO_MONITOR | tail -1 ) 
OLDEST=$(gawk 'match([=10=], /\[#\|(.*[0-9]*?)T(.*[0-9]*?)\+.*INFO/, m) {print m[1], m[2];} ' $LOG_TO_MONITOR | head -1)

if [ -z "$LATEST" ]
then
      # no line in log
                OLDEST_EPOCH=`(date --date="$OLDEST" +%s)`
                CURR_MINUS_TWO=$(date +"%Y-%m-%d %T" -d "2 mins ago")
                CURR_MINUS_TWO_EPOCH=`(date --date="$CURR_MINUS_TWO" +%s)`

                # If oldest log line is over two minutes old
                if [[ "$OLDEST_EPOCH" -lt "$CURR_MINUS_TWO_EPOCH" ]]
                then
                 log "No lines found."
                 <send notification>
                else
                 log "Server.log rotated."
                fi
<else and stuff>

日志轮换时我仍然收到一些通知,罪魁祸首是纪元时间是从完全空的日志文件中获取的。我通过使用 touch test.log 创建空的 .log 文件进行测试,然后设置 EMPTY=$(gawk 'match([=12=], /\[#\|(.*[0-9]*?)T(.*[0-9]*?)\+.*INFO/, m) {print m[1], m[2];} ' /home/USER/test.log | head -1) 现在,如果我 echo $EMPTY,我得到一个空行。但是,如果我将此空行转换为纪元时间 EPOCHEMPTY=`(date --date="$EMPTY" +%s)`,我会从 echo 中获得一个纪元时间 1584914400。这是指昨天晚上。显然,每次将空日期转换为纪元时间时都会出现相同的纪元,例如将“$EMPTY”替换为“”,至少在写这篇文章时是这样。

所以问题是,这个从空行算起的纪元时间是多少? 当 if 语句与这个值进行比较时,它会触发通知,即使它不应该触发通知。有没有一种方法可以避免将空字符串用于比较,而是从日志文件中获取其他时间值?

date 的手册定义传递给 -d 的空字符串将被视为一天的开始。

但是您可以依赖 -f/--file 选项和进程替换:

date -f <(echo -n "$your_date")

-f 选项允许您将文件作为参数传递,其中的每一行都将被视为 -d 的输入。一个空文件只会 return 一个空输出。

进程替换用于即时创建一个临时文件(准确地说是一个匿名管道,但它仍然是一个文件),它只包含你的变量的内容,如果变量未定义或为空字符串,否则为单行。