Возможно ли это?
Нам нужно STDERR (т.е. другие потоки, а затем STDOUT) иметь разные colo (u) r. Например, красный.
Мы используем bash, терминал должен быть Konsole (XTerm, терминал gnome или любой используемый).
Спасибо, если вы знаете: -)
Возможно ли это?
Нам нужно STDERR (т.е. другие потоки, а затем STDOUT) иметь разные colo (u) r. Например, красный.
Мы используем bash, терминал должен быть Konsole (XTerm, терминал gnome или любой используемый).
Спасибо, если вы знаете: -)
Здесь есть решение, которое сочетает в себе некоторые из хороших идей, уже представленных.
Создайте функцию в 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,'
)
Вы также можете проверить stderred: https://github.com/sickill/stderred
Я не вижу, что эмулятор терминала может каким-либо образом сделать это.
Интерфейс между эмулятором терминала и оболочкой/приложением осуществляется через псевдо-tty, где эмулятор терминала находится на главной стороне, а оболочка/приложение - на другой. В оболочке/приложении есть как stdout, так и stderr, подключенные к одному и тому же pty, поэтому, когда эмулятор терминала считывает из pty для вывода оболочки/приложения, он больше не может сказать, что было записано в stdout и которое было stderr.
Вам нужно будет использовать одно из решений, которое перехватывает данные между приложением и ведомым-pty и вставляет escape-коды для управления выходным colo вывода (u) r.
Вот немного 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 сначала проходит дополнительный процесс.
Я думаю, вы должны использовать стандартные escape-последовательности на stderr. Посмотрите это.
Hilite сделает это. Это легкое решение, но вы должны вызывать его для каждой команды, например. hilite gcc myprog.c. Более радикальный подход встроен в мою экспериментальную оболочку Gush, которая показывает stderr из всех команд, выполняемых красным цветом, stdout в черном. В любом случае это очень полезно для сборки программного обеспечения, где у вас много выходных данных с несколькими сообщениями об ошибках, которые можно легко упустить, если они не выделены.