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

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

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

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

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

 echo "pomme" 1>&2 

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

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

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

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

Акцент мой.

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

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

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

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

Рекомендации:

  • Коды терминалов (ANSI / VT100) в Wiki Wiki
  • Пропускные коды ANSI в Википедии