Для фона я ранее задал этот вопрос.
Я использую stderred для возвращения stderr текста, красного когда diplayed на терминале. Это работает приятно над большинством случаев, больше специально для того, что, кажется, двоичные исполняемые файлы в противоположность сценариям удара.
Я понял это stderred
кажется, не работает, когда stderr упомянут непосредственно от a command
названный от терминала.
Например, использование stderred
Я все еще не имею красными, если я использую перенаправление в качестве со следующим:
echo "pomme" 1>&2
Как несколько отличается перенаправление, чем другие случаи относительно stderred
рычаг?
Как я могу иметь красный для вывода stderr, если я перенаправляю 1>&2
в a /bin/bash
контекст, как я делаю в своих сценариях удара (Ubuntu 15.10)?
Если вы посмотрите на README stderred
, вы заметите, что он изменяет функцию write()
(и связанные функции потоков):
stderred hooks on write () и семейство потоковых функций (fwrite, fprintf, error ...) из libc, чтобы раскрасить весь вывод stderr, который идет на терминал, таким образом делая его отличимым от stdout. В основном он переносит текст, который идет в файл с дескриптором «2», с соответствующими управляющими кодами ANSI , делая текст красным.
blockquote>Подчеркните мое. sup> sup>
Когда вы перенаправляете 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 без воздействия на вызывающую оболочку или сценарий.Ссылки: