В общем, получение текущих цветов невозможно. Обработка управляющей последовательности терминала происходит «внутри» терминала, где бы это ни происходило. С эмулятором терминала, таким как xterm
или встроенный в ядро операционной системы, которое предоставляет виртуальные терминалы ядра, внутреннее состояние эмулятора, включая его представление о текущем «графическом представлении» (то есть цвет и атрибуты), находится на компьютере сам и теоретически доступен. Но для реального терминала эта информация находится в некотором месте ОЗУ на физически отдельной машине, подключенной через последовательный канал.
Тем не менее, некоторые терминалы включают в себя механизм для считывания такой информации как часть их протокола терминала, который отправляется по этой последовательной линии связи. Они предоставляют управляющие последовательности, которые программа может отправлять на терминал, что заставляет ее отправлять обратно информацию о своем внутреннем состоянии, как ввод с терминала. mikeserv
показал последовательности управления, на которые xterm
отвечает эмулятор терминала. Но это конкретно для xterm
. Например, встроенные эмуляторы терминала в ядре Linux и различных ядрах BSD представляют собой разные типы терминалов и вообще не реализуют никаких таких управляющих последовательностей. То же самое касается целых семей реальных терминалов.
Терминалы DEC VT525 реализуют механизм считывания, но имеют набор последовательностей управления, которые не имеют отношения к тем, которые используются xterm
. Один отправляет последовательность DECRQSS (запрос выбора или настройки), чтобы запросить текущее графическое представление, и терминал отвечает отправкой DECRPSS (выбор отчета или настройка). В частности:
- Хост отправляет: DCS
$
q
m
ST (DECRQSS с частью функции управления SGR в качестве настройки)
- Терминал отвечает: DCS
0
$
r
0
;
3
3
;
4
4
m
ST (DECRPSS с параметрами и частью функции управления последовательности управления SGR, которая устанавливает текущие цвета переднего плана и фона)
Конечно, внимательное изучение вашего вопроса показывает, что вы снова махаете бананом в шоколадной оболочке в этих европейских валютных системах. То, что вы на самом деле пытаетесь сделать, для которого вы выбрали решение, а затем спросили, как выполнить часть этого решения, - это сохранить предыдущее состояние, пока вы пишете какой-либо цветовой вывод. Для этого есть не только управляющая последовательность DEC VT, но и последовательность консольных терминалов SCO, которая распознается xterm
различными встроенными в ядро эмуляторами терминалов, и запись termcap / terminfo, которая сообщает вам, что они представляют для вашего терминала.
Записи termcap являются sc
и rc
. Записи terminfo - это save_cursor
и restore_cursor
. Имена несколько вводят в заблуждение относительно эффекта (хотя они действуют как предупреждение, что вы полагаетесь на что-то де-факто, а не де-юре ). Фактические последовательности управления DECSC, DECRC, SCOSC и SCORC также сохраняют и восстанавливают текущее графическое представление.
Учитывая, что статья, на которую вы указали, посвящена генерации управляющих последовательностей из сценариев оболочки, команда, которую вы сейчас ищете, - это tput
.
дальнейшее чтение
echotc Co
илиechoti colors
, но просто не существует переменной, в которой хранится текущее определение цветового кода.