Я работал над ответом ниже, но столкнулся с проблемой, которая может иметь отношение к другим ответам, а также к проблемам, которые не используются 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
, чтобы он был виден на консоли, а затем на регистраторе.