stdout и stderr ОБА изначально замаплены на ваш терминал. У терминала нет stdout и stderr, он есть у конкретной консольной программы.
Если вы хотите выводить ошибки красным цветом, просто выводите их красным цветом при помощи управляющих кодов, то есть не сам вывод перекрашивайте а ваш текст
mkone112, Для этого следует понимать как именно работает терминал.
Он не может это различать.
Вы можете взять stdout и stderr и направить их или в файл или в консоль. Все. Нет двух или трех консолей разных цветов.
Вывод различается именно для того, чтобы можно было замапить его на разные устройства, а не в одно устройство с разными цветами.
#!/bin/bash
rst="\e[0m"
red="\e[31m"
echo text
echo -e "${red}text${rst}">&2
Saboteur, а нельзя как-то stderr направить в какой-нибудь фильтр, а оттуда вместе с неизмененным stdout в терминал? Я просто не понимаю сути ограничения, есть два разных потока данные из которых попадают в терминал, почему нельзя один из потоков пропускать через какую-нибудь обработку до того как он смешается со вторым потоком?
ну пускай через обработку.
Напиши скрипт который все считывает и выводит в красном цвете, сохрани его как отдельный файл и перенаправляй в него stderr
Но фильтров как таковых нет. Ты работаешь с процессами и обычными хендлерами.
С потоком он не смешивается, они просто мапятся в одно устройство.
Можно другой терминал открыть и в него слать, если хочешь.
Давай так.
Ты открыл два файла на запись
файл1 и файл2
и говоришь
Я хочу чтобы моя команда
writetofile при записи через какой-то фильтр писала все буквы большими.
Как ты себе такой фильтр представляешь, если операционная система предоставляет просто одну команду writetofile?
stderr и stdout это именно такие открытые "файлы", с номерами 1 и 2.
Приложение открывает три дескриптора - stdin, stdout, stderr
stdin мапится к вашему терминалу на ввод, stdout и stderr мапится соответственно к вашему терминалу на вывод.
Терминал - это устройство, которое может быть локальным (если физически работать с экраном и клавиатурой) или виртуальным, если подключаешься по сети.
Все три дескриптора можно перенаправлять в другие места (в другие устройства, в файл, друг в друга).
Но нет места, где конкретный хендлер можно перенаправить.
Если ты в своей программе открываешь какой-то файл, это будет четвертый дескриптор. Ты же когда пишешь в файл и сохраняешь, оно же не красится в другой цвет?
Наверное можно закопаться глубоко в ядро линукса, и пометить чтобы во втором дескрипторе всегда что-то перекрашивать, но это патч операционной системы, а не настройки терминала или ssh клиента.