如何在注释输出的日期格式部分使用空格?

如何在注释输出的日期格式部分使用空格?

我尝试使用 annotate-output(devscripts 包的一部分)在脚本的输出前加上日期和一些额外信息。第一个参数可以是传递给 date 的格式字符串。我想在这个格式字符串中包含一个空格,但是,作为一个 bash 新手,我不知道如何转义空格以将其正确发送到 date。尝试了很多选项,但看起来无论我提供什么,系统都会吃掉它……

可以找到注释输出的来源这里

user@host:/home/user$ annotate-output '+myscript: %H:%M:%S' echo "A"
date: extra operand `%H:%M:%S'
Try `date --help' for more information.
 I: Started echo A
date: extra operand `%H:%M:%S'
Try `date --help' for more information.
 O: A
date: extra operand `%H:%M:%S'
Try `date --help' for more information.
 I: Finished with exitcode 0

预期输出:

myscript: 14:04:16 I: Started echo A
myscript: 14:04:16 O: A
myscript: 14:04:16 I: Finished with exitcode 0

答案1

不幸的是,该脚本有一些引用问题。如果您将此函数添加到代码中,它将起作用:

date ()
{
    command date "$*"
}

实际上你不需要改变源代码。这样做:定义“date”函数并导出它:

$ date() { command date "$*"; }
$ export -f date
$ annotate-output "+foo %T"  bash -c "echo stdout; echo stderr >&2"
foo 10:38:30 I: Started bash -c echo stdout; echo stderr >&2
foo 10:38:30 E: stderr
foo 10:38:30 O: stdout
foo 10:38:30 I: Finished with exitcode 0

如果您注释的内容也调用,则可能会出现问题date


如果你想修复系统上的注释输出,请应用此 diff

$ diff /usr/bin/annotate-output bin/annotate-output 
28c28
<       echo "`date ${FMT}` $1: $line"
---
>       printf "%s %s: %s\n" "$(date "$FMT")" "$1" "$line"
78c78
< echo "`date ${FMT}` I: Started $@"
---
> addtime I <<< "Started $*"
83c83
< echo "`date ${FMT}` I: Finished with exitcode $EXIT"
---
> addtime I <<< "Finished with exitcode $EXIT"

答案2

如果你正确引用参数它就会起作用:

annotate-output '+"myscript: %H:%M:%S"' echo "A"

date命令的格式参数以 开头+。没错。但是为了将空格传入其中,您应该+用引号括起后面的所有字符。否则它将接受空格后面的符号作为第二个命令行参数。

相关内容