Я работал над ответом ниже, но столкнулся с проблемой, которая может иметь отношение к другим ответам, а также к проблемам, которые не используют logger
, с его опцией тега, поэтому я отправлю свои выводы.
Во-первых, я сгенерировал смешанные стандартные сообщения о выходе и сообщения об ошибках, с некоторыми пробелами между ними:
echo abc; sleep 1; echo def >&2; sleep 1; echo ghi; sleep 1; echo jkl >&2
Затем я добавил out:
в начало стандартных выходных сообщений с:
{ echo abc; sleep 1; echo def >&2; sleep 1; echo ghi; sleep 1; echo jkl >&2; } | \
sed 's/^/out: /g';
Затем я добавил err:
в поток ошибок, добавив во все записи, затем удалив уже добавленные строки out:
(обратите внимание, что любая строка, используемая для out:
не должна начинать неизмененную запись ошибки):
{ { echo abc; sleep 1; echo def >&2; sleep 1; echo ghi; sleep 1; echo jkl >&2; } | \
sed 's/^/out: /g'; } 2>&1 | sed -e 's/^/err: /g' -e 's/^err: out: /out: /g'
Ответ Льюиса М. предполагает, что можно было бы использовать перенаправление в поток 3, чтобы избежать двойной замены, но это прекрасно работает с приведенным выше ограничением; однако буферизация означает, что записи не обязательно записываются в том порядке, в котором они были созданы, поэтому я закончил с:
stdbuf -i0 -o0 -e0 bash -c \
"{ { echo abc; sleep 1; echo def >&2; sleep 1; echo ghi; sleep 1; echo jkl >&2; } | \
sed 's/^/out: /g'; } 2>&1 | sed -e 's/^/err: /g' -e 's/^err: out: /out: /g'" | \
tee /dev/tty | logger
При этом предыдущая команда запускается в небуферизованной среде, а затем направляет вывод через tee
, чтобы она была видна на консоли, а затем на регистраторе.