Как получить удобочитаемое значение (например, RGB) от `\ e] 11;? \ A`?

Строка \e]11;?\a Предположительно дает фоновый цвет текущего терминала, но я не нашел способ использовать эту информацию, чтобы получить цвет в формате, читаемом человеком (например, RGB).

Я попытался (невольно)

 print -P '\e]11;?\a' 

но ничего не производит, или, по крайней мере, ничего не видно.

BTW, я знаю xtermcontrol --get-bg , но когда я запускаю его на терминале, над которым я работаю, я получаю сообщение об ошибке:

 xtermcontrol: --get-bg is unsupported or disallowed by this terminal. \ See also, TROUBLESHOOTING section of xtermcontrol(1) manpage. 

TROUBLESHOOTING section не было никаких действий).

Кстати, я преднамеренно пропустил подробности о терминале, который я использую, потому что я надеюсь найти общее решение, а не одно, которое работает только для конкретного терминала.

  • Пользовательские цвета заголовка экрана
  • Передача escape-последовательностей в оболочки в пределах ansi-term в Emacs
  • Преобразование журнала экрана в html
  • Захват цветов с копией буфера tmux (hardcopy)
  • Emacs ansi-term с zsh: ошибка в технологическом фильтре. Недопустимое лицо: неуказано
  • ANSI Цвета при использовании Systemd Service
  • Как использовать ESC-последовательности, чтобы сделать область прокрутки терминала
  • Графические консольные приложения в Emacs
  • 2 Solutions collect form web for “Как получить удобочитаемое значение (например, RGB) от `\ e] 11;? \ A`?”

    В этом вопросе есть пара фундаментальных проблем:

    1. Чтобы это приводило к общему решению, команда должна была поддерживаться ANSI X3.64 , базовым стандартом для всех современных терминалов , но, насколько я могу судить, это не ANSI-команда.

      Я не уверен, потому что у меня нет копии этого стандарта, я не могу найти его в Интернете, и ANSI не продаст мне его . Все, что я могу найти в Интернете, – это «ссылки». Как я описываю в другом месте , в то время как X3.64 является корневым стандартом для всех распространенных современных терминалов, это наблюдение немного напоминает указание, что собаки происходят от волков: изучение волков, чтобы узнать о собаках, создает серьезные ограничения на объем вещей, которые вы можете учить.

      Лучший ресурс, который я нашел, – это ссылка XTerm Control Sequences , поддерживаемая текущим поддерживающим xterm . Но это не нормативный стандарт, он просто описывает, что делает одна общая программа. Многие программы получены из исходного кода xterm , но, как и собаки из волков, многие из них значительно расходятся.

      Я подозреваю, что вы нашли бы, если бы вы преследовали его, что эта команда была введена xterm как расширение для ANSI X3.64, а ваш целевой терминал не поддерживает это конкретное расширение xterm , поэтому xtermcontrol терпит неудачу.

    2. Даже если ваш конкретный набор терминалов дает ответ на эту команду, я не вижу в вышеупомянутом документе, что вы собираетесь получить значение RGB. Вместо этого вы можете получить название цвета.

      (Это то, что мы ожидаем от нормального стандарта, который часто игнорируется в документах функционального описания).

      Кроме того, остерегайтесь, что даже если вы получите ответ R; G; B, ответ может отличаться. Если вы установили свой цвет с использованием более старых цветовых кодов ANSI X3.64, нет стандартного сообщения о том, к какому цвету RGB они относятся; действительно, каждая семейная терминальная программа xterm я когда-либо использовал, дает возможность изменить цвета RGB, используемые для цветовых кодов ANSI. Кроме того, вы можете изменить эти значения «на лету» в некоторых терминальных программах, так что два прогона программы, разделенные прогонкой сторонних программ, могут дать разные ответы, потому что цветовая схема теперь отличается.

    В сети SE есть еще один ответ, который делает примерно то же самое, что и ваш оператор print , но, как и ваша команда, команда echo другого ответа не получает ответа от терминала OS X, который утверждает, что он является терминалом xterm-256color . Это означает, что решение не работает даже для всех терминалов семейства xterm.

    Я написал более надежную программу на C, которая диагностирует ошибку, если это произойдет, а если нет, отображает возвращаемые значения в печатной форме. Вы можете обнаружить, что это более подходящая база для расширения, чем команды оболочки:

     #include <signal.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> char reply[40]; size_t nr; void timeout(int sn) { if (nr > 0) { for (size_t i = 0; i < nr; ++i) { printf("Got char %d\n", reply[i]); } if (!sn) puts("WARNING: Buffer filled!"); } else { puts("No reply from terminal."); } exit(0); } int main(void) { signal(SIGALRM, timeout); alarm(1); printf("\e]11;?\a"); for (nr = 0; nr < sizeof(reply); ++nr) { reply[nr] = getchar(); } timeout(0); /* buffer filled before alarm() timer went off! */ return 0; } - #include <signal.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> char reply[40]; size_t nr; void timeout(int sn) { if (nr > 0) { for (size_t i = 0; i < nr; ++i) { printf("Got char %d\n", reply[i]); } if (!sn) puts("WARNING: Buffer filled!"); } else { puts("No reply from terminal."); } exit(0); } int main(void) { signal(SIGALRM, timeout); alarm(1); printf("\e]11;?\a"); for (nr = 0; nr < sizeof(reply); ++nr) { reply[nr] = getchar(); } timeout(0); /* buffer filled before alarm() timer went off! */ return 0; } 

    Во-первых, маловероятно, что какой-то альтернативный метод (кроме ответов на контрольные последовательности) может быть основой «общего решения» по запросу ОП, поскольку искомое свойство не (например) не поддается методам, использующим свойства окна ,

    Далее, это пример управляющих последовательностей, которые реализованы в xterm, но не являются общедоступными. Об xtermcontrol знает разработчик xtermcontrol . На его странице обсуждаются последовательности управления xterm , комментарии, что их много ( множество ), и упоминает, что OSX Terminal.app поддерживает некоторые из них.

    Сообщение об ошибке, сообщаемое OP, безусловно, достаточно ясно. xtermcontrol программа, на которой OP пыталась запустить xtermcontrol , не поддерживает эту функцию. Скорее всего, он не поддерживает сопоставимую функцию, которая может быть использована вместо этого.

    На практике большинство контрольных последовательностей xterm не реализованы в других терминалах, независимо от использования их разработчиком «xterm» для описания терминала. См. Например, xterm FAQ Сравнение версий, путем подсчета элементов управления и часто задаваемых вопросов. Почему бы просто не использовать TERM для «xterm»? (отметив, что «производные от исходного кода xterm » могут быть интерпретированы более чем одним способом).

    Терминалы (возможно) большего интереса к OP не имеют полезной документации, на которой они реализуют управляющие последовательности. Таким образом, единственный способ найти, как «общее» решение у вас есть, – это исчерпывающее тестирование. Это кажется не очень общим.

    Ответ на xtermcontrol – это метод, используемый xtermcontrol . ( Ответ нисходящего xrdb не даст вам текущие настройки цвета от xterm , только его начальные значения – возможно, даже не это.)

    Interesting Posts

    Как запустить скрипт на экране при перезагрузке

    Невозможно подключиться к беспроводной сети с помощью Ralink MT7601

    «python-software-properties» не имеет кандидата на установку при установке факела

    Могу ли я создать файл на ext4 с глубиной> 1 для тестирования?

    Кросс-компилировать любой пакет aptitude?

    Как экспортировать функцию в bash через ssh?

    Копирование файлов с VCD без преобразования в MPEG

    Поиск и удаление файлов с определенной датой

    Добавьте нового пользователя с разрешениями, аналогичными существующим пользователям.

    В какую версию ядра я должен обновить Mint 18.2 Xfce?

    Live USB с Кали не загружается

    Альтернативное решение для создания нескольких копий одного файла с помощью командной строки?

    Awk не дает никакого результата

    Как получить дескриптор файла, отличный от stdin stdout и stderr (чтобы сделать что-то вроде $ program 1> file_1 3> file_2)?

    Openbox, похоже, не имеет правильных переменных окружения

    Linux и Unix - лучшая ОС в мире.