Категория > Новости > Анатомия терминала. Осваиваем текстуальную графику - «Новости»
Анатомия терминала. Осваиваем текстуальную графику - «Новости»16-02-2022, 00:01. Автор: Dutton |
Anatomy of a Terminal Emulator, дополненный врезками от редакции «Хакера». Перевод и текст врезок — Юрий Язев. В статье мы поговорим о разных частях терминала и о том, как они взаимодействуют, напишем небольшую прогу для чтения ввода в командной строке и рассмотрим, как она интерпретирует команды. Затем мы обсудим, как создать пользовательский интерфейс в терминальном приложении. И в конце концов увидим, как можно использовать все это ради шутки. Примеры кода я привел на языке Rust, в то же время я буду стараться делать их как можно проще и короче, чтобы даже незнакомому с Rust программисту было все понятно. Кроме того, я подробно опишу значимые части кода. Мы рассмотрим работу эмулятора терминала в Linux, но с таким же успехом ты можешь применить сведения в любой другой Unix-подобной системе (например, в macOS). Материал рассчитан на новичков в разработке терминальных приложений, тем не менее я старался сделать его полезным и для ветеранов разработки приложений командной строки. Установка RustЧтобы установить Rust в Linux или macOS, надо выполнить в командной строке следующую команду:
curl --proto '=https' --tlsv1.2 -sSfhttps://sh.rustup.rs | sh
В macOS ее выполнение проходит без сучка, без задоринки. Однако в Linux могут возникнуть разные проблемы, например связанные с отсутствием
sudo apt install rustc
Cargo Вместе с компилятором языка Rust устанавливается система сборки Cargo. Ее используют, чтобы управлять проектами, а кроме этого, она играет роль пакетного менеджера. С ее помощью создаются, объединяются, строятся проекты и скачиваются зависимые библиотеки. Чтобы создать проект, набери в консоли В результате будет создан проект с таким содержимым. Содержимое папки с проектом Исходный код программы HelloRust содержится в файле Файл
[package]
name = "HelloRust"
version = "0.1.0"
edition = "2022"
[dependencies]
Кроме того, в нем указываются библиотеки, используемые для компиляции программы (ниже ключевого слова Чтобы скомпилировать пример, надо выполнить команду Где писать Rust-код? В любой удобной для тебя IDE, поддерживающей подсветку синтаксиса. Это в идеальном случае. Плагины поддержки языка существуют для многих сред, например VS Code. Но можно воспользоваться абсолютно любым текстовым редактором. Это уже на твое усмотрение. Если рассматриваемая тема тебе интересна, напиши об этом в комментарии. Мы подумаем над новыми статьями, посвященными этому языку. Разные части терминалаВремя от времени эмулятор терминала называют командной строкой (оболочкой) или pty (псевдотерминалом). Для начала обсудим смысловую нагрузку этих названий и решим, в каких контекстах они могут использоваться. Эмулятор терминала имеет длинную историю, но мы сконцентрируемся на тех вещах, которые подразумеваются под этим словом в наши дни. Как эмулятор терминала (gnome terminal, alacritty, rxvt-unicode), так и командная оболочка (bash, zsh, fish) представляют собой приложения, выполняемые под управлением операционной системы. Эмулятор терминала — это графическое приложение, которое преобразует поступающие из командной оболочки данные и отображает их на экране. Обычно вывод текстовый, но могут быть исключения. Их мы рассмотрим дальше. Командная оболочка (у нас распространено короткое название shell) предоставляет интерфейс к операционной системе, позволяет пользователю взаимодействовать с ее файловой системой, запускать процессы, а иногда — выполнять скрипты. Эти две программы соединяются с помощью pty (pseudoterminal), который организует двунаправленный асинхронный канал связи между ними. В одном направлении pty передает данные от терминала к оболочке (STDIN), во втором — от оболочки к терминалу (STDOUT). Другими словами, когда пользователь вводит команды в терминал, последний пересылает их через канал STDIN псевдотерминала (pty) в оболочку. С другой стороны, когда оболочка готова показать пользователю результат на экране, она отправляет данные в терминал по каналу STDOUT псевдотерминала. Как видно, у pty имеются две стороны. Мы будем называть их «первичная» и «вторичная», хотя в официальной документации они называются master и slave. На первичной стороне находится эмулятор терминала, на вторичной — командная оболочка. Тем не менее на вторичной стороне может располагаться любая программа, ожидающая подключения терминала, например Vim или Top. Предлагаю взглянуть на картинку, демонстрирующую, как эта система работает в целом, на примере команды Процесс ls получает от операционной системы данные и передает их сначала командной оболочке, а та, в свою очередь, по каналу STDOUT pty эмулятору терминала Как эмулятор терминала интерпретирует и отображает данные, полученные из командной оболочки?Когда командная оболочка отправляет текст терминалу, она использует весь доступный ей набор инструкций. Ты мыслишь в правильном направлении, если назвал этот набор escape-символами ANSI. Они используются, когда командной оболочке надо каким‑либо образом форматировать вывод: изменить цвет/стиль шрифта или переместить курсор ввода. Чтобы увидеть, как это работает, давай напишем небольшую программку на Rust, которая создает псевдотерминал (pty) и на вторичной стороне запускает предопределенную в конкретной системе командную оболочку. Таким образом мы сможем увидеть, какие данные из недр системы нам шлет shell.
wwwИсходные коды примеров в статье можно найти в репозитории автора. Функция Перейти обратно к новости |