我尝试使用 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
命令的格式参数以 开头+
。没错。但是为了将空格传入其中,您应该+
用引号括起后面的所有字符。否则它将接受空格后面的符号作为第二个命令行参数。