Как использовать пробел в разделе формата даты annotate-output?

Я пытаюсь использовать annotate-output (часть пакета devscripts) для префикса выходных данных скрипта с датой и некоторой дополнительной информацией. Первый параметр может быть строкой формата, переданной на сегодняшний день. Я хочу включить пробел в эту строку формата, однако, будучи новичком в bash, я понятия не имею, как избежать пробела, чтобы правильно отправить его на дату. Перепробовал кучу вариантов, но похоже что бы я ни предоставлял, sys просто ест это...

Источник аннотирования-вывода можно найти ЗДЕСЬ.

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

2 ответа

Это будет работать, если вы правильно указали параметр:

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

date аргумент формата команды начинается с +, Вот так. Но чтобы пропустить в него место, вы должны обернуть все символы после + с цитатами. В противном случае он будет принимать символы, следующие за пробелом, в качестве второго аргумента командной строки.

К сожалению, этот скрипт имеет некоторые проблемы с цитированием. Это будет работать, если вы добавите эту функцию в код:

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"
Другие вопросы по тегам