Как я могу записать в stderr так, чтобы stderred окрасил его в красный?

Для фона я ранее задал этот вопрос.

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

Я понял это stderred кажется, не работает, когда stderr упомянут непосредственно от a command названный от терминала.

Например, использование stderred Я все еще не имею красными, если я использую перенаправление в качестве со следующим:

echo "pomme" 1>&2

Как несколько отличается перенаправление, чем другие случаи относительно stderred рычаг?

Как я могу иметь красный для вывода stderr, если я перенаправляю 1>&2 в a /bin/bash контекст, как я делаю в своих сценариях удара (Ubuntu 15.10)?

1
задан 2 January 2016 в 06:58

1 ответ

Если вы посмотрите на README stderred, вы заметите, что он изменяет функцию write() (и связанные функции потоков):

stderred hooks on write () и семейство потоковых функций (fwrite, fprintf, error ...) из libc, чтобы раскрасить весь вывод stderr, который идет на терминал, таким образом делая его отличимым от stdout. В основном он переносит текст, который идет в файл с дескриптором «2», с соответствующими управляющими кодами ANSI , делая текст красным.

Подчеркните мое.

Когда вы перенаправляете stdout в stderr, они указывают на одно и то же, правда. Однако вызовы функций, которые записывают в stdout, все равно называют его stdout, независимо от того, какое перенаправление вы делаете. Они по-прежнему обращаются к файловому дескриптору 1, а не 2.

Если вы хотите писать в stderr и иметь его цветной, обычного перенаправления оболочки будет недостаточно. Вам нужно использовать что-то, что пишет напрямую в stderr. Функция awk в аналогична Unix & amp; Пост Linux может быть адаптирован для работы с несколькими аргументами:

error () (
  IFS=' '
  awk -v msg="$*" 'BEGIN { print msg > "/dev/stderr" }'
)

Я использовал /dev/stderr, так как это легче читать и упомянуть в документах GNU awk . Также обратите внимание, что я использовал ( ) вместо { } для группировки команд. Это приводит к тому, что команды запускаются в подоболочке, поэтому я могу безопасно изменять IFS без воздействия на вызывающую оболочку или сценарий.

Ссылки:

4
ответ дан 3 December 2019 в 06:59

Другие вопросы по тегам:

Похожие вопросы: