Подтвердить что ты не робот

Могут ли STDOUT и STDERR использовать разные цвета под XTerm/Konsole?

Возможно ли это?

Нам нужно STDERR (т.е. другие потоки, а затем STDOUT) иметь разные colo (u) r. Например, красный.

Мы используем bash, терминал должен быть Konsole (XTerm, терминал gnome или любой используемый).

Спасибо, если вы знаете: -)

4b9b3361

Ответ 1

Здесь есть решение, которое сочетает в себе некоторые из хороших идей, уже представленных.

Создайте функцию в bash script:

color()(set -o pipefail;"[email protected]" 2>&1>&3|sed $'s,.*,\e[31m&\e[m,'>&2)3>&1

Используйте его следующим образом:

$ color command -program -args

Показывает команду stderr красным цветом.

Продолжайте читать для объяснения того, как это работает. Есть некоторые интересные функции, продемонстрированные этой командой.

  • color()... — Создает функцию bash, называемую цветом.
  • set -o pipefail — Это опция оболочки, которая сохраняет код возврата ошибки команды, выход которой передается в другую команду. Это делается в подоболочке, которая создается скобками, чтобы не изменять параметр pipefail во внешней оболочке.
  • "[email protected]" — Выполняет аргументы функции как новую команду. "[email protected]" эквивалентно "$1" "$2" ...
  • 2>&1 — Перенаправляет команду stderr в команду stdout, чтобы она стала sed stdin.
  • >&3 — Сокращение для 1>&3, это перенаправляет stdout в новый временный дескриптор файла 3. 3 позже перенаправляется в stdout.
  • sed ... — Из-за переадресаций выше sed stdin является stderr выполненной команды. Его функция состоит в том, чтобы окружать каждую строку цветовыми кодами.
  • $'...' Конструкция bash, которая заставляет его понимать символы с обратным слэшем.
  • .* — Совпадает со всей строкой.
  • \e[31m — Последовательность escape-кода ANSI, которая вызывает следующие символы:
  • & — Символ замены sed, который расширяется до всей согласованной строки (вся строка в этом случае).
  • \e[m — ANSI escape-последовательность, которая сбрасывает цвет.
  • >&2 — Сокращение для 1>&2, это перенаправляет sed stdout на stderr.
  • 3>&1 — Перенаправляет временный дескриптор файла 3 обратно в stdout.

Здесь расширение одного и того же понятия, которое также делает STDOUT зеленым:

function stdred() (
    set -o pipefail;
    ("[email protected]" 2>&1>&3 | sed $'s,.*,\e[31m&\e[m,' >&2) 3>&1 \
                  | sed $'s,.*,\e[32m&\e[m,'
)

Ответ 3

Я не вижу, что эмулятор терминала может каким-либо образом сделать это.

Интерфейс между эмулятором терминала и оболочкой/приложением осуществляется через псевдо-tty, где эмулятор терминала находится на главной стороне, а оболочка/приложение - на другой. В оболочке/приложении есть как stdout, так и stderr, подключенные к одному и тому же pty, поэтому, когда эмулятор терминала считывает из pty для вывода оболочки/приложения, он больше не может сказать, что было записано в stdout и которое было stderr.

Вам нужно будет использовать одно из решений, которое перехватывает данные между приложением и ведомым-pty и вставляет escape-коды для управления выходным colo вывода (u) r.

Ответ 4

Вот немного Awk script, который напечатает все, что вы передадите ему красным цветом.

#! /usr/bin/awk -f
{printf("%c[%dm%s%c[0m\n",0x1B,31,$0,0x1B);fflush()}

Он просто печатает каждую строку, которую он получает, на stdin в необходимых кодах эвакуации, чтобы отобразить ее красным цветом. За ним следует код выхода на reset терминал.

(Если вам нужен другой цвет, измените значение 31)

Сохраните его в colr.awk, выполните chmod a+x и используйте его так:

$ my_program | ./colr.awk

У него есть недостаток, что строки могут не отображаться по порядку, потому что stderr переходит непосредственно в консоль, а stdout сначала проходит дополнительный процесс.

Ответ 5

Я думаю, вы должны использовать стандартные escape-последовательности на stderr. Посмотрите это.

Ответ 6

Hilite сделает это. Это легкое решение, но вы должны вызывать его для каждой команды, например. hilite gcc myprog.c. Более радикальный подход встроен в мою экспериментальную оболочку Gush, которая показывает stderr из всех команд, выполняемых красным цветом, stdout в черном. В любом случае это очень полезно для сборки программного обеспечения, где у вас много выходных данных с несколькими сообщениями об ошибках, которые можно легко упустить, если они не выделены.