Prepend, а затем перенаправить - PullRequest
0 голосов
/ 02 марта 2020

Я хочу перенаправить stderr в файл для целей ведения журнала:

2>> "$logFile"

Как мне добавить строку "error: " к каждой строке?

Ответы [ 4 ]

2 голосов
/ 02 марта 2020

Другой вариант: sed:

2> >(sed -u 's/^/error: /' >> "$logfile")

Использование только встроенных bash может оказаться невозможным, поскольку этот механизм префикса строки должен работать с потоком.

Примечание использование gnu sed option -u (--unbuffered) для загрузки минимальных объемов данных из входных файлов и flu sh выходных буферов чаще.

Code Demo

1 голос
/ 02 марта 2020

Поскольку подстановка процессов в моем AIX содержит ошибки Bash 4.2.50, альтернативой https://en.wikipedia.org/wiki/Process_substitution является использование FIFO:

logFile='/tmp/stderr.log'
fifoFile='/tmp/log123.fifo'
mkfifo $fifoFile
glub 2>> $fifoFile & #the & is needed because otherwise the FIFO will block
cat $fifoFile | sed -u 's/^/error: /' >> "$logFile"

Демонстрация кода

Амперсанд & в третьей строке необходим, потому что в противном случае FIFO будет блокироваться, пока не будет считыватель.

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

1 голос
/ 02 марта 2020

Чистая Bash версия:

2> >(while read -r line ; do echo "error: $line" ; done >> "$logFile")

. , , но обратите внимание, что это будет вести себя неправильно, если программа записывает нулевые байты, или если программа не записывает символ новой строки после последней строки. (Обе эти проблемы решаемы, но в какой-то момент мы должны усомниться в том, стоит ли это просто избегать вызова awk или sed.)

1 голос
/ 02 марта 2020

Вы можете использовать подстановку процесса.

2> >(awk '{print "error: " $0}' >> "$logfile")

Или со старыми оболочками с нарушенной поддержкой подстановки процесса:

{ { prog >&3; } 2>&1 | sed 's/^/error: /' >> "$logfile"; } 3>&1

Здесь мы сохраняем стандартный вывод prog в fd 3 направьте его stderr в sed и в конце восстановите fd 3 обратно в stdout.

...