Доступен новый Windows Terminal — он потрясающий –

Это звучит потрясающе, но почему бы вам просто не улучшить существующую windows console?

Основной целью Windows Console является сохранение обратной совместимости с существующими инструментами командной строки, скриптами и т. д. Хотя нам и удалось добавить множество ключевых улучшений в функционал консоли (например, добавить поддержку VT и 24-битного цвета и т. д. см.

), мы не можем внести дальнейшие существенные улучшения в UI консоли без “нарушения мира”.

Поэтому пришло время для нового, свежего подхода.

Windows Terminal устанавливается и работает вместе с существующим приложением Windows Console. Если вы непосредственно запускаете Cmd/PowerShell/пр., они начнут подключаться к традиционному экземпляру консоли точно так же, как обычно. Таким образом, обратная совместимость остается неизменной, и в то же время вы можете использовать Windows Terminal, если/когда вы захотите это сделать.

↑ вкладки и панели

Наиболее значимая фишка Windows Terminal – поддержка многовкладочности, это самая часто запрашиваемая функция для консольных приложений Windows. В разных вкладках терминала можно открывать разные консольные инструменты и разные их сеансы. Но Microsoft сделала даже больше: она реализовала возможность открытия разных инструментов и их сеансов внутри вкладки, в разделённых панелях по типу многопанельных файловых менеджеров.

А можем открыть в панелях другие консольные инструменты. Для этого их необходимо запустить текущей вкладке с зажатой клавишей Alt.

Вкладки можно дублировать, переименовывать назначать им цвета.

↑ поведение

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

Для Windows Terminal можно сменить консольный инструмент, запускаемый по умолчанию. Таким является, как упоминалось, PowerShell, и вместо него можем установить командную строку или прочие инструменты. Также можем установить современный терминал приложением по умолчанию для командной строки.

Cargo

Вмес­те с ком­пилято­ром язы­ка Rust уста­нав­лива­ется сис­тема сбор­ки Cargo. Ее исполь­зуют, что­бы управлять про­екта­ми, а кро­ме это­го, она игра­ет роль пакет­ного менед­жера. С ее помощью соз­дают­ся, объ­еди­няют­ся, стро­ятся про­екты и ска­чива­ются зависи­мые биб­лиоте­ки.

Что­бы соз­дать про­ект, набери в кон­соли cargo new HelloRust.

В резуль­тате будет соз­дан про­ект с таким содер­жимым.

Содержимое папки с проектом
Со­дер­жимое пап­ки с про­ектом

Ис­ходный код прог­раммы HelloRust содер­жится в фай­ле main.rs, который, в свою оче­редь, находит­ся в пап­ке src.

Файл Cargo.toml содер­жит метадан­ные опи­сания про­екта:

Кро­ме того, в нем ука­зыва­ются биб­лиоте­ки, исполь­зуемые для ком­пиляции прог­раммы (ниже клю­чево­го сло­ва [dependencies]). Все рас­смат­рива­емые в статье при­меры обра­щают­ся к либе nix = “0.17.0”.

Что­бы ском­пилиро­вать при­мер, надо выпол­нить коман­ду cargo build, находясь в пап­ке с про­ектом. А что­бы запус­тить про­ект на выпол­нение, нуж­но наб­рать коман­ду cargo run. Она не толь­ко запус­тит прог­рамму на выпол­нение, но и пересо­берет ее, если в исходный код будут вне­сены изме­нения.

Unicode

В ори­гиналь­ной статье пред­став­лен вывод, сос­тоящий из ANSI-сим­волов. Одна­ко в нашем слу­чае опе­раци­онная сис­тема выводит текст в Unicode-сим­волах. Мож­но пред­положить, что у авто­ра опе­раци­онка чис­то англий­ская, у меня же опе­раци­онка локали­зиро­вана на рус­ский.

К счастью, оста­лись в прош­лом рус­ские ANSI-кодиров­ки, которые из‑за сво­ей несов­мести­мос­ти отоб­ражали докумен­ты кра­козяб­рами. Теперь бал пра­вят Unicode-кодиров­ки, которые прек­расно выводят сим­волы не толь­ко кирил­лицы, но и всех осталь­ных язы­ков мира.

В выводе мы можем наб­людать обыч­ный текст, обиль­но прип­равлен­ный escape-пос­ледова­тель­нос­тями Unicode. Рань­ше мы обсужда­ли escape-пос­ледова­тель­нос­ти ANSI. Unicode-пос­ледова­тель­нос­ти отли­чают­ся от рас­смот­ренных тем, что могут содер­жать боль­шее раз­нооб­разие сим­волов, одна­ко такой под­ход не исполь­зует­ся из‑за необ­ходимос­ти обес­печить сов­мести­мость с уста­рев­шим аппа­рат­ным и прог­рам­мным обес­печени­ем.

Да­вай пос­мотрим, как эму­лятор тер­минала интер­пре­тиру­ет escape-пос­ледова­тель­нос­ти. Escape-сим­вол u{1b} исполь­зует­ся для обоз­начения начала или кон­ца escape-пос­ледова­тель­нос­ти. Два началь­ных сим­вола u ука­зыва­ют на то, что дан­ный сим­вол отно­сит­ся к Unicode-сим­волам. У ANSI-сим­волов такого нет.

Windows terminal – новый взгляд на старые вещи

windows-terminal-000.pngКазалось бы, что может быть более неизменным, нежели Командная строка Windows? Это приложение, словно живое ископаемое, кажется, помнит времена первых версий Windows NT и Windows 95, возможности тоже остались где-то там, в далеких и светлых днях. То, что терминал нужно менять было понятно еще давно, но не было понятно как. Ведь терминальные приложения в современных ОС это не только командная строка, но и PowerShell, и консоли WSL. Но Microsoft отлично справилась с этой проблемой, новое приложение Windows Terminal способно не только объединить все в одном месте, но и существенно расширить возможности привычных оболочек.

Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном курсе по администрированию MikroTik. Автор курса, сертифицированный тренер MikroTik Дмитрий Скоромнов, лично проверяет лабораторные работы и контролирует прогресс каждого своего студента. В три раза больше информации, чем в вендорской программе MTCNA, более 20 часов практики и доступ навсегда.

Взаимоотношения Windоws и командной строки долгое время были достаточно прохладными. Основная парадигма управления системой строилась вокруг графических инструментов и мыши, а командная строка рассматривалась как дополнительный атрибут и инструмент восстановления. Ни о каком полноценном управлении системой через терминал речи не шло, даже для автоматизации предлагался отдельный скриптовый язык VBScript.

Все стало меняться с выходом PowerShell и появлением Core-версий Windows – постепенно Microsoft стала осознавать важность консольного инструмента для управления системой, и чаша весов снова качнулась в другую сторону, сегодня ряд продуктов не имеют полноценных графических инструментов настройки, зато предлагают для этого PowerShell. Подсистема Windows для Linux также не предполагает никаких графических инструментов, снова напоминая о том, что терминал не пережиток прошлого, а мощный и удобный инструмент.

Windows Terminal – это современное приложение, демонстрирующее новый взгляд Microsoft на старые вещи, причем не только новый, но и достаточно неожиданный. Это свободное ПО под лицензией MIT исходные коды которого расположены на GitHub и принять участие в его разработке может каждый. Как видим, времена действительно меняются, и компания, еще недавно называвшая открытое ПО “раковой опухолью” теперь выпускает под открытой лицензией один из основных инструментов администрирования.

Продукт доступен в двух версиях: стабильной Windows Terminal и версии для разработчиков и инсайдеров Windows Terminal Preview. Последняя получает все новые функции непосредственно после их разработки и является наиболее интересной и в дальнейшем мы будем рассматривать именно ее.

Рекомендованным способом получения приложения является Microsoft Store, но также возможны и альтернативные методы установки, более подробно о них можно узнать на странице GitHub.

windows-terminal-001.pngПосле установки приложении автоматически добавит профили для всех установленных в системе консольных приложений Windows и WSL, а также будет их автоматически регистрировать при добавлении в систему, например, если вы установите новую версию PowerShell или новый экземпляр Linux в WSL. Кроме того, отдельно добавляется профиль для Azure Cloud Shell. Профилем по умолчанию является встроенный в систему Windows Power Shell.

windows-terminal-002.pngПриятные новшества радуют с первых секунд работы с новым терминалом. Во-первых, это вкладки, теперь ничего не мешает удобно организовать рабочее пространство и не путаться в мешанине окон. Во-вторых – это рендеринг текста поддержкой ускорения на GPU, что дает отличную прорисовку шрифтов и делает текст визуально привлекательным.

windows-terminal-003.pngК сожалению графической оболочки для настройки терминала пока нет, при выборе пункта Параметры будет открыт JSON-файл с настройками, однако это не должно пугать любителя командной строки. В конфигурационном файле сначала идут глобальные параметры, а затем описания профилей. Структура достаточно простая и не должна вызвать особых сложностей.

Прежде всего переопределим командную оболочку по умолчанию. Для этого найдите guid нужного профиля и скопируйте его в опцию defaultProfile:

defaultProfile": "{574e775e-4f2a-5b96-acle-a2962a402336}",

Затем включим привычное Linux-пользователям поведение, когда текст копируется при его выделении и потом может быть вставлен правым кликом мыши:

copyOnSelect": true,

Перейдем к самим профилям. Их настройки достаточно просты и очевидны: это guid, наименование, источник или командная строка запуска и видимость. Если вы не хотите видеть профиль в списке выбора, то просто установите опцию hidden в true, мы таким образом скрыли оболочку Azure.

hidden": true,

windows-terminal-004.pngВсе изменения применяются налету, перезапускать терминал не нужно.

:/>  Фризы в играх на очень мощном пк | Пикабу

Еще одной долгожданной особенностью являются панели, позволяющие разделить окно терминала на несколько областей. Для разделения по горизонтали нажмите Alt Shift , для разделения по вертикали Alt Shift -, чтобы закрыть панель используйте Ctrl Shift W. При этом в новой панели будет открыта командная оболочка по умолчанию. Чтобы открыть в панели другой профиль просто выберите его из списка с зажатой клавишей Alt. Для дублирования текущего профиля нажмите Alt Shift D. В заголовке вкладки будет отображаться наименование текущей панели.

windows-terminal-005.png

Для изменения размера панелей используйте клавиши со стрелками одновременно зажав Alt Shift, при этом будет меняться размер активной панели.

windows-terminal-006.png

Терминал поддерживает практически полную кастомизацию. Можно изменять цвет, шрифт, фоновое изображение, прозрачность панелей, задавать иконки, также поддерживаются темы, включающие множество настроек для различных вариантов отображения. Мы не будем углубляться так далеко, большее количество настроек можно найти в документации: https://docs.microsoft.com/ru-ru/windows/terminal/get-started.

Но некоторые настройки мы все-же сделаем. По умолчанию все панели выглядят одинаково, что может приводить к некоторой путанице, поэтому есть смысл изменить цвет фона, чтобы быстро понимать, где какая консоль запущена, для этого добавьте в профиль опцию background с шестнадцатеричным кодом цвета, например, “родной” цвет для PowerShell:

"background": "#012456",

Мы указали для разных консолей привычные цвета и сразу стало гораздо удобнее:

windows-terminal-007.pngТакже очень легко можно создавать свои профили. Допустим мы хотим добавить в терминал подключение по SSH к одному из своих Linux-серверов. Прежде всего для нового профиля нужно получить guid, для этого в среде PowerShell выполните:

[guid]::NewGuid()

windows-terminal-008.pngТеперь добавим в конфигурационный файл секцию нового профиля:

{
"guid": "{437dc877-4e9d-405a-8c86-837093861986}",
"name": "Debian 1C Server",
"commandline": "ssh andrey@192.168.233.141",
"icon": "ms-appdata:///roaming/icons8-console-32.png",
"hidden": false
},

Синтаксис довольно прост, но поясним некоторые параметры. Опция commandline указывает строку запуска, а в опции icon мы задали индивидуальную иконку профиля, для этого можно использовать как ico-файлы, так и обычные png. Иконку следует разместить в специальной директории, для Windows Terminal это:

%LOCALAPPDATA%PackagesMicrosoft.WindowsTerminal_8wekyb3d8bbweRoamingState

Для Windows Terminal Preview:

%LOCALAPPDATA%PackagesMicrosoft.WindowsTerminalPreview_8wekyb3d8bbweRoamingState

После чего к ним можно будет обращаться как:

ms-appdata:///roaming/имя_файла

windows-terminal-009.pngПодобным образом можно добавлять неограниченное число профилей на все случаи жизни и практически к любому приложению. Например. мы создали еще один профиль для работы с командной строкой PostgreSQL, для этого мы заглянули в “родной” bat-файл для запуска и позаимствовали оттуда строку запуска:

{
"guid": "{5507e755-60ae-4d8e-aa01-e75da98b95c8}",
"name": "PSQL Shell",
"commandline": "C:\Program Files\PostgreSQL 1C\10\bin\psql.exe -h localhost -U postgres -d postgres -p 5432",
"icon": "ms-appdata:///roaming/PostgreSQL_logo.png",
"hidden": false
}

Обратите внимание, если это последний профиль в списке, то запятая после закрывающей фигурной скобки не ставится.

windows-terminal-010.pngВ заключение хочется сказать, что новый Windows Terminal нам очень понравился и мы рекомендуем всем, кто еще не пробовал, попробовать работу с ним. Это действительно новый подход Microsoft к старым и привычным вещам и на этот раз у них действительно получилось современное, удобное и динамично развивающееся приложение.

Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном курсе по администрированию MikroTik. Автор курса, сертифицированный тренер MikroTik Дмитрий Скоромнов, лично проверяет лабораторные работы и контролирует прогресс каждого своего студента. В три раза больше информации, чем в вендорской программе MTCNA, более 20 часов практики и доступ навсегда.

Глобальные настройки

Следующие глобальные настройки являются наиболее полезными, хотя другие задокументированы в документации Терминала.

«defaultProfile» определяет GUID профиля, который используется по умолчанию при запуске Windows Terminal.

Установите «copyOnSelect»для trueавтоматического копирования выделенного текста в буфер обмена без необходимости нажимать Ctrl Shift  C.

Установите, «copyFormatting»чтобы falseпросто копировать простой текст без какого-либо стиля. (Хотелось бы, чтобы это было по умолчанию для всех приложений!)

Задайте «initialColumns»и «initialRows«равным количеству знаков для горизонтального и вертикального размеров.

«tabWidthMode» может быть установлен на:

  1. «equal»: каждая вкладка одинаковой ширины (по умолчанию)
  2. «titleLength»: каждая вкладка устанавливается равной ширине ее заголовка, или
  3. «compact»: неактивные вкладки уменьшаются до ширины их значка.

«disabledProfileSources«устанавливает массив, который предотвращает автоматическое создание профилей. Например:

"disabledProfileSources":["Windows.Terminal.Wsl","Windows.Terminal.Azure","Windows.Terminal.PowershellCore"],

Это отключит все сгенерированные профили; удалите те, которые хотите сохранить.

Использование терминала для создания скриптов

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

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

Как установить терминал windows

Самый простой способ установить Терминал Windows — через Microsoft Store:

ms-windows-store://pdp/?ProductId=9n0dx20hk701

Если эта ссылка не работает, попробуйте открыть Microsoft Store в своем браузере или запустить приложение Microsoft Store из меню «Пуск» Windows и выполнить поиск по запросу «Терминал».

Примечание: будьте осторожны, чтобы не выбрать более раннее приложение «Windows Terminal Preview».

Нажмите » Получить» и подождите несколько секунд для завершения установки.

Если у вас нет доступа к Магазину, вы можете загрузить последнюю версию с GitHub.

Windows Terminal значок приложения теперь доступны в меню Пуск в Windows. Для облегчения доступа щелкните значок правой кнопкой мыши и выберите » Закрепить на начальном экране» или » Еще», а затем — » Закрепить на панели задач«.

Как эмулятор терминала интерпретирует и отображает данные, полученные из командной оболочки?

Ког­да коман­дная обо­лоч­ка отправ­ляет текст тер­миналу, она исполь­зует весь дос­тупный ей набор инс­трук­ций. Ты мыс­лишь в пра­виль­ном нап­равле­нии, если наз­вал этот набор escape-сим­волами ANSI. Они исполь­зуют­ся, ког­да коман­дной обо­лоч­ке надо каким‑либо обра­зом фор­матиро­вать вывод: изме­нить цвет/стиль шриф­та или перемес­тить кур­сор вво­да.

Что­бы уви­деть, как это работа­ет, давай напишем неболь­шую прог­рам­мку на Rust, которая соз­дает псев­дотер­минал (pty) и на вто­рич­ной сто­роне запус­кает пре­доп­ределен­ную в кон­крет­ной сис­теме коман­дную обо­лоч­ку. Таким обра­зом мы смо­жем уви­деть, какие дан­ные из недр сис­темы нам шлет shell.

Фун­кция main начина­ется с того, что мы получа­ем путь к сис­темной коман­дной обо­лоч­ке из перемен­ной окру­жения SHELL. В слу­чае ошиб­ки фун­кция expect выводит сооб­щение.

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

Фун­кция spawn_pty_with_shell воз­вра­щает фай­ловый дес­крип­тор пер­вичной сто­роны pty STDOUT. Затем в фун­кцию read_from_fd (она будет рас­смот­рена чуть поз­же) в качес­тве парамет­ра переда­ется получен­ный STDOUT (хра­нимый в перемен­ной stdout_fd), а внут­ри фун­кции про­исхо­дит чте­ние дан­ных из STDOUT.

Рас­смот­рим фун­кцию spawn_pty_with_shell:

За­меть, в этом коде мы исполь­зуем биб­лиоте­ку nix — обер­тку для вза­имо­дей­ствия с небезо­пас­ным кодом на C. Фун­кция forkpty из биб­лиоте­ки libc раз­вет­вля­ет текущий про­цесс.

Ина­че говоря, выраже­ния match язы­ка Rust име­ют ту же смыс­ловую наг­рузку, что опе­ратор switch в C . Отсю­да сле­дует: если forkpty успешно раз­ветви­ла про­цесс и вер­нула OK, то прог­рамма про­дол­жает выпол­нение в двух потоках.

:/>  Проект OpenNet: MAN ping (1) Команды и прикладные программы пользовательского уровня (FreeBSD и Linux)

Глав­ный поток сох­раня­ет в перемен­ную stdout_fd дес­крип­тор фай­лового потока — STDOUT, а в дочер­нем потоке про­исхо­дит запуск дефол­тной обо­лоч­ки, получен­ной фун­кци­ей spawn_pty_with_shell в парамет­ре default_shell.

Да­лее в глав­ном потоке фун­кция spawn_pty_with_shell воз­вра­щает дес­крип­тор фай­лового потока (STDOUT) в main, что­бы та переда­ла его фун­кции read_from_fd для чте­ния дан­ных из дочер­него потока.

Если forkpty воз­вра­щает ошиб­ку, вызыва­ется мак­рос panic, который воз­вра­щает сооб­щение об ошиб­ке и немед­ленно завер­шает при­ложе­ние, потому что в таком слу­чае его выпол­нение бес­полез­но.

Рас­смот­рим сле­дующую фун­кцию — read_from_fd:

При­няв в парамет­ре фай­ловый дес­крип­тор fd, который был получен из фун­кции spawn_pty_with_shell, мы переда­ем его вмес­те с изме­няемым буфером памяти раз­мером 65 536 бай­тов фун­кции read.

Она чита­ет ука­зан­ный объ­ем бай­тов, помеща­ет его в передан­ный буфер и воз­вра­щает количес­тво про­читан­ных бай­тов. При усло­вии, что чте­ние завер­шилось успешно (зна­чение перемен­ной read_result боль­ше нуля), про­читан­ный буфер прев­раща­ется в век­тор. Затем этот век­тор воз­вра­щает­ся в основную фун­кцию. На моей машине вывод выг­лядит так:

"u{1b}]0;fish /home/yurembo/rust_projects/spawn_and_read_from_shellu{7}u{1b}[30mu{1b}(Bu{1b}[mu{1b}[2m⏎u{1b}(Bu{1b}[m r⏎ ru{1b}[KWelcome to fish, the friendly interactive shellrnTypehelpfor instructions on how to use fishrnu{1b}[?2004hu{1b}]7;file://yurembo-VirtualBox/home/yurembo/rust_projects/spawn_and_read_from_shellu{7}u{1b}]0;fish /home/yurembo/rust_projects/spawn_and_read_from_shellu{7}u{1b}[30mu{1b}(Bu{1b}[mu{1b}[92myurembou{1b}(Bu{1b}[m@u{1b}(Bu{1b}[myurembo-VirtualBoxu{1b}(Bu{1b}[m u{1b}[32m~/r/spawn_and_read_from_shellu{1b}(Bu{1b}[mu{1b}(Bu{1b}[m> u{1b}[Ku{1b}]0;fish /home/yurembo/rust_projects/spawn_and_read_from_shellu{7}u{1b}[30mu{1b}(Bu{1b}[mru{1b}[92myurembou{1b}(Bu{1b}[m@u{1b}(Bu{1b}[myurembo-VirtualBoxu{1b}(Bu{1b}[m u{1b}[32m~/r/spawn_and_read_from_shellu{1b}(Bu{1b}[mu{1b}(Bu{1b}[m> u{1b}[Krnu{1b}[30mu{1b}(Bu{1b}[m"

Вывод первых 65 536 байтов после запуска дефолтной оболочки
Вы­вод пер­вых 65 536 бай­тов пос­ле запус­ка дефол­тной обо­лоч­ки

Unicode

В ори­гиналь­ной статье пред­став­лен вывод, сос­тоящий из ANSI-сим­волов. Одна­ко в нашем слу­чае опе­раци­онная сис­тема выводит текст в Unicode-сим­волах. Мож­но пред­положить, что у авто­ра опе­раци­онка чис­то англий­ская, у меня же опе­раци­онка локали­зиро­вана на рус­ский. К счастью, оста­лись в прош­лом рус­ские ANSI-кодиров­ки, которые из‑за сво­ей несов­мести­мос­ти отоб­ражали докумен­ты кра­козяб­рами. Теперь бал пра­вят Unicode-кодиров­ки, которые прек­расно выводят сим­волы не толь­ко кирил­лицы, но и всех осталь­ных язы­ков мира. На тему борь­бы с кодиров­ками десять лет назад я написал статью. Наде­юсь, будет инте­рес­но и поз­наватель­но.

В выводе мы можем наб­людать обыч­ный текст, обиль­но прип­равлен­ный escape-пос­ледова­тель­нос­тями Unicode. Рань­ше мы обсужда­ли escape-пос­ледова­тель­нос­ти ANSI. Unicode-пос­ледова­тель­нос­ти отли­чают­ся от рас­смот­ренных тем, что могут содер­жать боль­шее раз­нооб­разие сим­волов, одна­ко такой под­ход не исполь­зует­ся из‑за необ­ходимос­ти обес­печить сов­мести­мость с уста­рев­шим аппа­рат­ным и прог­рам­мным обес­печени­ем. И вряд ли ког­да будет исполь­зовать­ся даже в новом обо­рудо­вании или прог­рам­мном обес­печении, ведь любую escape-пос­ледова­тель­ность мож­но сос­тавить из ANSI-сим­волов.

Да­вай пос­мотрим, как эму­лятор тер­минала интер­пре­тиру­ет escape-пос­ледова­тель­нос­ти. Escape-сим­вол u{1b} исполь­зует­ся для обоз­начения начала или кон­ца escape-пос­ледова­тель­нос­ти. Два началь­ных сим­вола u ука­зыва­ют на то, что дан­ный сим­вол отно­сит­ся к Unicode-сим­волам. У ANSI-сим­волов такого нет.

Не­зави­симо от исполь­зуемо­го для вывода язы­ка любой тек­сту­аль­ный интерфейс, который выводит­ся в тер­минале, работа­ет оди­нако­вым обра­зом.

Красивый текст

В Windows Terminal используется GPU-ускорение DirectWrite/DirectX на основе движка рендеринга текста. Этот новый движок рендеринга текста будет отображать текстовые символы, глифы и символы, присутствующие в шрифтах на вашем ПК, включая идеограммы CJK, эмодзи, символы powerline, значки, лигатуры программирования и т. д. Этот движок даже рендерит текст намного быстрее, чем предыдущий движок GDI консоли!

У вас также будет возможность использовать наш новый шрифт! Мы хотели создать веселый, новый, моноширинный шрифт, чтобы улучшить современный внешний вид терминала. Этот шрифт не только будет включать лигатуры программирования, но и будет иметь собственный Open-Source репозиторий. Оставайтесь с нами для получения дополнительной информации о новом проекте шрифта!

Настройки и конфигурируемость

Мы связались со многими пользователями командной строки, которые любят кастомизировать свои терминалы и приложения командной строки. Windows Terminal предоставляет множество настроек и параметров конфигурации, которые дают большой контроль над внешним видом терминала и каждой из оболочек/профилей, которые можно открывать как новые вкладки.

Используя механизм конфигурирования терминала, вы сможете создать несколько “профилей” для каждой оболочки/приложения/инструмента, которые вы хотите использовать, будь то PowerShell, Command Prompt, Ubuntu или даже SSH-соединения с Azure или устройствами IoT.

Необрабатываемый режим

При раз­работ­ке при­ложе­ний для тер­минала мы хотим более тон­ко кон­тро­лиро­вать поль­зователь­ский ввод. По умол­чанию канал вво­да STDIN не поз­воля­ет нам это­го добить­ся. Рас­смот­рим сле­дующий при­мер. Допус­тим, при­ложе­ние зада­ет такой пря­моли­ней­ный воп­рос:

Вы хотите завершить программу? [д/н]

Од­нако, как мы обсужда­ли в начале статьи, pty пос­троч­но буфери­зиру­ет ввод STDIN. Это озна­чает, что при­ложе­ние смо­жет про­честь ввод толь­ко пос­ле того, как поль­зователь наж­мет Enter, пред­варитель­но вве­дя одно­бук­венный ответ.

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

Спе­циаль­ная обра­бот­ка вво­да отклю­чает­ся (нажатие ком­бинации кла­виш Ctrl C боль­ше не отправ­ляет сиг­нал SIGINT тер­миналу).

Рас­смот­рим неболь­шую прог­рам­мку, демонс­три­рующую опи­сан­ное:

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

Не­обра­баты­ваемый режим — широко рас­простра­нен­ное свой­ство тер­миналь­ных при­ложе­ний. В нем поль­зователь­ский ввод не дуб­лиру­ется, и при­ложе­ние может выпол­нять с ним любые дей­ствия:

  • из­менять цвет шриф­та в зависи­мос­ти от кор­рек­тнос­ти коман­ды (как во мно­гих сов­ремен­ных коман­дных обо­лоч­ках);
  • кон­тро­лиро­вать вво­димый текст, что­бы он не вылезал за гра­ницы опре­делен­ных эле­мен­тов управле­ния;
  • ре­аги­ровать непос­редс­твен­но на вво­димые сим­волы, не дожида­ясь нажатия кла­виши Enter.
Raw Mode
Raw Mode

Пос­ле запус­ка при­ложе­ния нажатие любой кла­виши будет дуб­лировать стро­ку воп­роса: «Вы хотите завер­шить прог­рамму? [д/н]», нажатие кла­виши с бук­вой д завер­шит при­ложе­ние.

Параметры командной строки

Терминал Windows можно запустить с ярлыка или с любого терминала Windows или Linux, запустив его wt.exe. Поддерживаются следующие варианты:

вариантописание
—help, -h, -?,/?отображает справку
—maximized, -Mзапуск максимизирован
—fullscreen, -Fзапускать в полноэкранном режиме

Вы также можете передать список команд, разделенных точкой с запятой. Команды используются для определения новых вкладок и панелей с дополнительными параметрами управления:

командапараметрыописание
new-tab—profileили -p, —startingDirectoryили -d, commandline,—titleоткрыть новую вкладку
split-pane—horizontalили -H, —verticalили -V, —profileили -p, —startingDirectoryили -d, commandline,—titleоткрыть новую панель
focus-tab—target или же -tсфокусировать вкладку

Примеры

Следующие примеры необходимо запускать из стандартной cmdкомандной строки или ярлыка.

Открыть терминал для Windows с Ubuntuи Windows Powershellзакладками:

wt -p "Ubuntu"; new-tab -p "Windows PowerShell"

Откройте Windows Terminal с Ubuntu, Windows Powershell, и Command Promptпрофили в отдельных областях:

wt -p "Ubuntu"; split-pane -V -p "Windows PowerShell"; split-pane -H -p "Command Prompt"

Дополнительные примеры запуска Windows Terminal из оболочки Linux или Powershell доступны в документации Windows Terminal.

Разделение панелей для нескольких оболочек одновременно

Вкладки — это здорово, но что, если вы хотите видеть сразу несколько сред оболочки? Именно здесь на помощь приходит функция панелей терминала Windows.

Чтобы создать новую панель, нажмите Alt Shift D. Терминал разделит текущую панель на две и предоставит вам вторую. Щёлкните панель, чтобы выбрать её. Вы можете щёлкнуть панель и нажать Alt Shift D, чтобы продолжить её разделение.

Эти панели связаны с вкладками, поэтому вы можете легко иметь несколько многопанельных сред в одном окне Терминала Windows и переключаться между ними с панели вкладок.


Вот ещё несколько сочетаний клавиш для работы с панелями:

  • Создать новую панель, разделив её по горизонтали: Alt Shift – (Alt, Shift и знак минус)
  • Создать новую панель, разделив ее по вертикали: Alt Shift (Alt, Shift и знак плюса)
  • Перемещение фокуса панели: Alt Лево, Alt Право, Alt Низ, Alt Верх
  • Изменить размер области в фокусе: Alt Shift Лево, Alt Shift Право, Alt Shift Низ, Alt Shift Верх
  • Закрыть панель: Ctrl Shift W

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

Разные части терминала

Вре­мя от вре­мени эму­лятор тер­минала называ­ют коман­дной стро­кой (обо­лоч­кой) или pty (псев­дотер­миналом). Для начала обсу­дим смыс­ловую наг­рузку этих наз­ваний и решим, в каких кон­тек­стах они могут исполь­зовать­ся.

Эму­лятор тер­минала име­ет длин­ную исто­рию, но мы скон­цен­три­руем­ся на тех вещах, которые под­разуме­вают­ся под этим сло­вом в наши дни. Как эму­лятор тер­минала (gnome terminal, alacritty, rxvt-unicode), так и коман­дная обо­лоч­ка (bash, zsh, fish) пред­став­ляют собой при­ложе­ния, выпол­няемые под управле­нием опе­раци­онной сис­темы.

Эму­лятор тер­минала — это гра­фичес­кое при­ложе­ние, которое пре­обра­зует пос­тупа­ющие из коман­дной обо­лоч­ки дан­ные и отоб­ража­ет их на экра­не. Обыч­но вывод тек­сто­вый, но могут быть исклю­чения. Их мы рас­смот­рим даль­ше.

Ко­ман­дная обо­лоч­ка (у нас рас­простра­нено корот­кое наз­вание shell) пре­дос­тавля­ет интерфейс к опе­раци­онной сис­теме, поз­воля­ет поль­зовате­лю вза­имо­дей­ство­вать с ее фай­ловой сис­темой, запус­кать про­цес­сы, а иног­да — выпол­нять скрип­ты.

:/>  Что такое режим Fastboot в Xiaomi: определение, способы включения и выключения режима | Cтатьи

Эти две прог­раммы соеди­няют­ся с помощью pty (pseudoterminal), который орга­низу­ет дву­нап­равлен­ный асин­хрон­ный канал свя­зи меж­ду ними. В одном нап­равле­нии pty переда­ет дан­ные от тер­минала к обо­лоч­ке (STDIN), во вто­ром — от обо­лоч­ки к тер­миналу (STDOUT).

Дру­гими сло­вами, ког­да поль­зователь вво­дит коман­ды в тер­минал, пос­ледний пересы­лает их через канал STDIN псев­дотер­минала (pty) в обо­лоч­ку. С дру­гой сто­роны, ког­да обо­лоч­ка готова показать поль­зовате­лю резуль­тат на экра­не, она отправ­ляет дан­ные в тер­минал по каналу STDOUT псев­дотер­минала.

Как вид­но, у pty име­ются две сто­роны. Мы будем называть их «пер­вичная» и «вто­рич­ная», хотя в офи­циаль­ной докумен­тации они называ­ются master и slave. На пер­вичной сто­роне находит­ся эму­лятор тер­минала, на вто­рич­ной — коман­дная обо­лоч­ка.

Пред­лагаю взгля­нуть на кар­тинку, демонс­три­рующую, как эта сис­тема работа­ет в целом, на при­мере коман­ды ls.

Процесс ls получает от операционной системы данные и передает их сначала командной оболочке, а та, в свою очередь, по каналу STDOUT pty эмулятору терминала
Про­цесс ls получа­ет от опе­раци­онной сис­темы дан­ные и переда­ет их сна­чала коман­дной обо­лоч­ке, а та, в свою оче­редь, по каналу STDOUT pty эму­лято­ру тер­минала

Специальный набор символов

Ког­да мы рас­смат­ривали вывод обо­лоч­ки Fish, то обра­тили прис­таль­ное вни­мание на инс­трук­цию u{1b}. Мы опре­дели­ли этот escape-сим­вол как гра­ницу escape-пос­ледова­тель­нос­ти. Дру­гими сло­вами, за этим сим­волом escape-пос­ледова­тель­нос­ти обра­баты­вают­ся по‑дру­гому.

Сна­чала тек­сто­вый поток может читать­ся и выводить­ся как обыч­ный текст, а встре­тив этот стоп‑сим­вол, интер­пре­татор будет обра­баты­вать сим­волы осо­бым обра­зом, обра­зуя спе­циаль­ный набор сим­волов. Он может исполь­зовать­ся, нап­ример, для рисова­ния тек­сту­аль­ных интерфей­сов.

Рас­смот­рим при­мер. Выпол­ни в тер­минале сле­дующую коман­ду:

Квадрат, начерченный с помощью escape-последовательности
Квад­рат, начер­ченный с помощью escape-пос­ледова­тель­нос­ти

Пос­ле перек­лючения на исполь­зование «спе­циаль­ных сим­волов» мы можем рисовать фигуры пос­ложнее, а во вре­мя рисова­ния — перек­лючать вывод обратно для отоб­ражения обыч­ных сим­волов. Загони в тер­минал такой набор тек­ста:

Он интер­пре­тиру­ется в такой вывод.

В пре­дыду­щем при­мере мы перек­люча­емся с обыч­ного набора сим­волов на спе­циаль­ный и обратно.

Ни­же пред­став­лена таб­лица спе­циаль­ных сим­волов, которые мож­но исполь­зовать в тек­сту­аль­ном рисова­нии.

Так много настроек: сочетания клавиш, цветовые схемы, фон и многое другое

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


Вы увидите текстовый файл JSON с множеством параметров. В качестве инструмента разработчика Windows Terminal в настоящее время позволяет настраивать эти параметры путём изменения текстового файла, а не с помощью графического интерфейса.

Доступные параметры, которые вы можете изменить в файле Settings.json, включают:

В отличие от стандартных сред командной строки, PowerShell и Linux Bash в Windows 10, Терминал Windows наконец-то снабжён всеми необходимыми разработчиками опциями, которые уже много лет используются в других операционных системах, таких как Mac и Linux.

Терминал открыт

Прежде чем продолжить, стоит сделать краткий обзор того, что такое терминал на самом деле. Это потому, что мы, разработчики, работающие в Windows, привыкли объединять терминалы и программы оболочки в одну расплывчатую идею. Например, вы можете подумать, что когда Windows перешла со старой командной строки на объектно-ориентированную оболочку PowerShell, она заменила программу терминала. Но на самом деле это неправда.

Терминал – это часть программного обеспечения, которое обрабатывает текстовый ввод и отображение. Вы вводите текст в командной строке терминала. Вы смотрите в окно терминала. Но за кулисами ваш терминал взаимодействует с программой оболочки, которая действительно выполняет эту работу. В современной Windows стандартная программа терминала – ConHost.exe, и, черт возьми, она старая.

Вы думаете, что запускаете PowerShell, но на самом деле вы запускаете интерфейс ConHost, который взаимодействует с PowerShell.

Microsoft очень не хочет что-либо менять в работе ConHost, потому что это стержень вековой обратной совместимости. Фактически, основной принцип дизайна ConHost – не нарушать обратной совместимости любой ценой. Даже исправление ошибок рискует уничтожить век сценариев и инструментов, которые каким-то образом все еще работают в режиме совместимости в современной Windows.

Вместо этого Microsoft начала создавать новый терминал под названием Windows Terminal. Он существует уже почти год, но еще не дошел до включения в ОС Windows. Это означает, что если вам нужен Терминал Windows, вы должны установить его из Windows Store.

Терминал, как манипулятор файлов и папкок

Большинству пользователей нет необходимости использовать Терминал благодаря графической оболочке их операционной системы. Однако, без него не обойтись, когда речь идет о манипуляциях с файлами и папками более сложными, чем: «скопировать документ из одной папки и вставить в другую». Я приведу простой пример, показывающий ограниченность использования графической оболочки операционной системы.

Допустим, мне нужно переименовать фотографию и добавить к текущему названию дату, когда эта фотография была сделана. Что может быть проще, скажите Вы: “открой свойства файла, скопируй дату создания файла, закрой окно «Свойства» и вставь дату в название файла”.

Решение этой же задачи в Терминале займет не более получаса даже у начинающего пользователя. Фокус в том, что в Терминале пользователь может программировать действия, делегируя компьютеру рутинную работу. В разных типах эмуляторов терминала – разные языки программирования, но вероятно самым распространенным в наши дни является язык bash (о нем скоро будет отдельная статья).

Управления суперкомпьютерами и серверами через терминал

Терминал является не только окном в операционную систему персонального компьютера, но также и в операционную систему сервера или суперкомпьютера, который может находиться в тысячах километров от Вашего текущего месторасположения. Через эмулятор терминала на суперкомпьютер можно подавать алгоритмы (bash-скрипты), выполнение которых на Вашем компьютере могло бы занять неделю.

Как правило, на суперкомпьютерах и серверах стоят версии операционной системы Linux. Так как различий между эмуляторами терминала на Линуксе и на Маке практически нет, в дальнейших статьях я буду писать только об эмуляторах терминала, работающих на языке программирования bash (например, программа Terminal).

Sigwinch — отзывчивый пользовательский интерфейс в терминале

В пос­ледние годы под вли­янием все­мир­ной паути­ны и динами­чес­ких веб‑стра­ниц стал популя­рен тер­мин «отзывчи­вый UI», отно­сящий­ся к при­ложе­ниям, спо­соб­ным изме­нять свой интерфейс в зависи­мос­ти от раз­меров окна.

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

Раз­рабаты­вая тек­сту­аль­ные при­ложе­ния, работа­ющие в окне тер­минала, мы тоже можем вос­поль­зовать­ся парадиг­мой «отзывчи­вого UI» и соз­давать кру­той «поль­зователь­ский опыт», не толь­ко под­гоняя при­ложе­ния к раз­меру окна, но и отоб­ражая раз­ные эле­мен­ты в зависи­мос­ти от это­го раз­мера.

Что­бы сде­лать это, мы можем прос­лушивать сиг­нал SIGWINCH, который генери­рует­ся каж­дый раз в запущен­ном в дан­ный момент про­цес­се, ког­да окно тер­минала меня­ет раз­мер. Получив этот сиг­нал, мы изме­ним отоб­ражение эле­мен­тов управле­ния в соот­ветс­твии с изме­нив­шимся раз­мером окна тер­минала. Это демонс­три­рует сле­дующий при­мер:

Что­бы пой­мать нуж­ный сиг­нал, мы исполь­зуем ящик signal-hook (ты же пом­нишь, что под­клю­чаемые либы в Rust называ­ются ящи­ками?). Внут­ри фун­кции main раз­ворачи­вает­ся сле­дующий алго­ритм:

  • про­исхо­дит пер­воначаль­ный вывод гра­фичес­ких эле­мен­тов с помощью фун­кции draw_ui();
  • за­пус­кает­ся цикл по всем сиг­налам, пос­тупа­ющим в при­ложе­ние;
  • ожи­дает­ся сиг­нал SIGWINCH, пос­тупа­ющий в момент изме­нения раз­мера окна тер­минала;
  • пос­ле его получе­ния вызыва­ется фун­кция перери­сов­ки эле­мен­тов управле­ния — draw_ui().

Для кор­рек­тной перери­сов­ки содер­жимого окна тер­минала нам необ­ходимо знать его раз­мер, который нам под­ска­жет сис­темный вызов ioctl. Он выпол­няет­ся в фун­кции getTerminalSize(). Пос­ледняя вызыва­ется из draw_ui().

За­тем мы ждем пос­тупле­ния сиг­налов SIGTERM, SIGINT, SIGQUIT и SIGHUP, которые сиг­нализи­руют о завер­шении работы при­ложе­ния. Ког­да обна­ружи­вает­ся один из них, цикл перебо­ра сиг­налов пре­рыва­ется. Содер­жимое окна тер­минала очи­щает­ся, и отоб­ража­ется кур­сор.

В зависи­мос­ти от раз­мера окно тер­минала может иметь три раз­ных содер­жания.

Средний размер
Сред­ний раз­мер

Оставьте комментарий

Adblock
detector