Возможно ли это?
Нам нужно 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 в черном. В любом случае это очень полезно для сборки программного обеспечения, где у вас много выходных данных с несколькими сообщениями об ошибках, которые можно легко упустить, если они не выделены.