LINUX.ORG.RU

Общие сведения о работе терминала

 ,


0

1

Эту заметку пишу как ответ на коммент в тему Хочу работу с мышью как в терминале ConEmu Но пишу быстро и по верхам, так что в общий раздел, а не в раздел статьи. Возможно окажется полезным, чтоб ссылаться сюда в случае похожих вопросов у новичков.

Всё это у меня немного путается. Терминалы, консоли, командные строки. Признаюсь, я в терминологии немного чайник.

Ща всё разъясним.

Базово есть такая архитектура:

Приложение-терминал <--> TTY <--> программа, которая хочет общаться через терминал

TTY это компонент ядра. Кроме того, что служит связующим звеном, он также реализует некоторые базовые фичи, которые делают терминал немного «умнее». Дело в том, что исторически терминалы (те самые — физические, аппаратные терминалы) для Unix были концептуально «тупые». То есть умели только выводить текст по командам программы, а также пересылать ей, какие клавиши пользователь нажал. Для некоторых других ОС терминалы были «умные», с продвинутыми средствами работы с данными на стороне терминала. Но в Unix они не применялись. Unix вообще концептуально была про простоту. А ля делай только самое необходимое и не больше.

Так вот TTY реализует некоторые базовые примитивы и алгоритмы для случаев, когда программа не умеет или не предназначена сама работать с терминалом.

Про работу TTY я писал подробную статью, вот тут можно прочитать: https://wandrien.github.io/articles/tty/

Далее.

Если программа хочет сама продвинуто работать с терминалом, она настраивает TTY, чтобы оно ей не мешало, то есть отключает его логику обработки данных частично или полностью. И таким образом работает с терминалом прозрачно, без особого вмешательства TTY.

Кроме того, что программа настроила TTY, ей нужно еще управлять самим терминалом.

Терминал управляется через некоторый протокол. Этих протоколов и их вариаций за историю была чертова уйма. Обычно конкретное приложение-терминал поддерживает некоторый базовый набор + какие-нибудь специфичные для себя фишки. Кто-то меньше, кто-то больше. Например, если внимательно почитать, сколько команд и режимов работы имеет xterm, там можно потеряться. Ну короче зоопарк как с браузерами или как с поддержкой разных фич в видеокартах.

Для реализации концепции командной строки программы обычно не велосипедят всю логику работы с терминалом с нуля, а берут готовые решения. Часто это библиотека readline. Например, она используется в bash.

В мире BSD-софта вместо readline обычно используется libedit. Ну и еще куча альтернатив есть, как обычно.

Итак, если мы работаем с командным интерпретатором bash, он использует библиотеку readline, реализующую фичи строки ввода, и readline отображает текст в терминале и реагирует на наши команды правки текста.

Если мы работаем с Midnight Commander, то там вместо readline применяется продвинутый тулкит, который реализует окошки, кнопки, поля ввода и так далее.

В zsh, если память не изменяет, используется не readline, а свой отдельный велосипед. (Лень факт-чекать.)

Вот так всё это устроено.

То есть в таких случаях логика работы с вводом пользователя находится в некотором компоненте в составе клиентской программы. А сам терминал тут не особо играет роль.

Теперь к вопросу про мышь, который был в исходном треде.

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

Таким образом получается, что не достаточно сделать так, чтобы мышь работала только в командной строке. Нужно, чтобы приложение еще и «обычную» логику выделения текста как-то у себя поддерживало.

Но! Тут есть обходной путь. Если, например, мы запустим mc и попытаемся выделить текст с нажатой Shift, то увидим, что мышь обрабатывается терминалом, а не mc. Удержание Shift принудительно возвращает обработку мыши в терминал.

Вот вроде и всё, что я хотел вам на эту тему сообщить сегодня. =)

Спасибо за попытку объяснить.

Кроме того, что программа настроила TTY, ей нужно еще управлять самим терминалом

Вот, вы часто упоминаете некую программу. Что это за программа?

  1. shell (bash, zsh)
  2. или консольные программы вроде ffmpeg, wget, curl, aria2, mc, nano?

Если 2, то получается узким горлышком (в плане работы с мышью) является ядерный TTY, если 1, то нужен продвинутый shell?

netrium
()
Ответ на: комментарий от netrium

Я пообщался с ChatGPT и он мне сказал, что в Linux программы вроде GNOME Terminal правильно называть эмуляторами терминала (они запускают shell). А в Windows нет терминалов в Unix представлении* и правильно называть «командная строка (Command Prompt)» или «cmd», они напрямую обращаются к API системы и также являются shell’ом.

  • кроме Windows Terminal, WSL.
netrium
()
Ответ на: комментарий от netrium
  1. shell (bash, zsh)
  2. или консольные программы вроде ffmpeg, wget, curl, aria2, mc, nano?

Здесь неправильное разделение. Правильно так:

  1. bash, zsh, mc, nano
  2. ffmpeg, wget, curl, aria2

Разница в том, что п.1 — программы, которые имеют собственный пользовательский интерфейс, а п.2 — нет.

Понятие «консольная программа» максимально размытое.

В винде «консольной программой» называется программа, которая прямо в заголовке exe-файла маркирует себя таковой. Винда создаёт для неё особые условия работы.

В лине ничего такого нет.

Программа запускается, и она:

  1. Может подключиться к X11 или Wayland для отображения графического интерфейса.
  2. Может использовать терминал для текстового интерфейса. (bash, zsh, mc, nano)
  3. Может вообще не иметь средств UI и просто исполнять алгоритм в соответствии с переданными ей параметрами запуска. (ffmpeg, wget, curl, aria2)

Может быть гибрид всех этих вариантов.

Если 2, то получается узким горлышком (в плане работы с мышью) является ядерный TTY

Да, при чем там не только с мышью будет проблема, там вообще минимум средств а ля «стереть предыдущий символ», «стереть предыдущее слово», «стереть всю строку». И всё. Если запустить cat > /tmp/test.txt и водить текст, вот это и будет этот минимум.

wandrien ★★
() автор топика
Последнее исправление: wandrien (всего исправлений: 1)
Ответ на: комментарий от netrium

Я пообщался с ChatGPT

Он рассказал лишь «terminology for dummies». так учат дедушек и бабушек на компьютерных курсах.

кроме Windows Terminal, WSL

А если в Windows Terminal запущен cmd.exe, то тогда «Command Prompt»? А если в conhost.exe bash из WSL, то уже терминал?
Кстати conhost.exe поддерживает почти все эскейпы из VT100, разве что гиперссылки не завезли, а-ля:

echo -e "\e]8;;https://ya.ru\e\\Яндекс\e]8;;\e\\"
dmitry237 ★★★★
()
Ответ на: комментарий от wandrien

Нужен или крутой shell (интерпретатор команд) или надстройка в самом эмуляторе терминала (как сделали в warp.dev, он использует bash/zsh, а удобство, как я и просил). Жаль, проприетарный. Ну, и 9term не испытывает проблем с мышью (использует что-то своё).

netrium
()
Ответ на: комментарий от netrium

как сделали в warp.dev, он использует bash/zsh, а удобство, как я и просил

Если я правильно догадался, как это у них там работает… Эх, попробовать vte пропатчить что ли. Впрочем, я сейчас плохо себя чувствую, не до кодинга(

wandrien ★★
() автор топика

Эту заметку пишу

К сожалению, из статей в форум тему я перенести могу, а обратно движок не позволяет. Могу поговорить с Макскомом, если ты считаешь, что из этого материала может получиться что-то долгоиграющее (на мой взгляд – вполне может, тема интересная).

hobbit ★★★★★
()
Ответ на: комментарий от wandrien

В винде «консольной программой» называется программа, которая прямо в заголовке exe-файла маркирует себя таковой. Винда создаёт для неё особые условия работы. В лине ничего такого нет.

В общем можно уверенно считать, что «консольная программа» – понятие определённо виндовое, а разговоры о «консольных» линуксовых программах – результат культурного влияние винды на линуксят.

vM ★★
()