Вы можете перенаправить stderr/stdout на подстановку процесса, которая добавляет выбранный префикс. Например, этот скрипт:
#! /bin/bash
exec > >(trap "" INT TERM; sed 's/^/foo: /')
exec 2> >(trap "" INT TERM; sed 's/^/foo: (stderr) /' >&2)
echo foo
echo bar >&2
date
Производит этот вывод:
foo: foo
foo: (stderr) bar
foo: Fri Apr 27 20:04:34 IST 2018
Первые две строки перенаправляют stdout и stderr соответственно на команды sed, которые добавляют foo:
и foo: (stderr)
к входным данным.
Вызовы встроенной оболочки -в команде trap
гарантируют, что подоболочка не завершится при завершении сценария с помощью Ctrl+C
или при отправке сигнала SIGTERM
с помощью kill $pid
. Это гарантирует, что ваша оболочка не завершит ваш скрипт принудительно, потому что файловый дескриптор stdout
исчезает при завершении sed
, потому что он также получил сигнал завершения. По сути, вы по-прежнему можете использовать ловушки выхода в своем основном скрипте, и sed
по-прежнему будет работать для обработки любых выходных данных, сгенерированных при запуске ваших ловушек выхода. Подоболочка все еще должна завершиться после завершения вашего основного скрипта, чтобы процесс sed
не оставался запущенным навсегда.
Не так много информации, но вот руководство, которому я бы следовал, чтобы отладить проблему такого рода, если бы не управление брандмауэром: