# Терминал

<!-- Что узнаем? -->
В результате обучения вы:
* узнаете, что такое терминал, оболочка, интерпретатор командной строки и как они связаны друг с другом;
* узнаете о разных видах терминалов: виртуальном, эмулируемом, удаленном, текстовом и графическом;
* познакомитесь с командами `exit`, `ls`, `history`, `clear`, `date`, `cal`, `who`;


## Виды терминалов

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

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

<!-- Понятие "оболочка" и "терминал" -->
Среда рабочего стола и интерпретатор командной строки представляют два способа управления компьютером -- две оболочки, которые связывают пользователя с компьютером.
Первая из них графическая, а вторая -- текстовая.
Оболочка -- это управляющая программа (или набор программ), которая действия пользователя передает системе и отображает ее реакцию на экране.
Управляющая программа совместно с клавиатурой и экраном образует терминал -- точку доступа к системе.
Под графическим и текстовым терминалами подразумевают систему под управлением графической и текстовой оболочки.

<!-- Виртуальный терминал -->
Современная система позволяет обслуживает нескольких пользователей, предоставляя каждому отдельный терминал.
Но и один пользователь может подключиться к одной системе несколько раз.
ОС предоставляет несколько терминалов, называемых виртуальными.
Переключение между ними происходит комбинацией клавиш «Ctrl-Alt-Fx», где Fx одна из функциональных клавиш из `F1`-`F12`.
На одном из этих виртуальных терминалов размещен ваш рабочий стол.

<!-- Эмулятор терминала -->
Получить доступ к командной строке можно и без покидания графического терминала.
Каждая среда рабочего стола предоставляет специальную оконную программу, эмулирующую текстовый терминал.
Такая программа называется *эмулятором терминала*.
Существует большое количество эмуляторов: `Termite`, `Konsole`, `Xfce Terminal`, `Xterm`, `Tilda`, `Terminator`, `QTerminal`, `Lilyterm`, `Tilix`, `Animal` и другие.
В проекте GNOME такой программой является `GNOME Terminal`.
Она вызывается комбинацией клавиш `Ctrl-Alt-T` или из системного контекстного меню `Открыть в терминале`.

<!-- XTerm, UXTerm -->

<!-- Удаленный терминал -->
Современный уровень техники позволяет получать доступ к системам, расположенных на любом расстоянии.
Это происходит при доступе к суперкомпьютеру, к арендованным виртуальным серверам.
Такой тип подключения образует *удаленный терминал*, который располагается на стороне пользователя, и благодаря межсетевому взаимодействию дает доступ к удаленному компьютеру.


## Получение доступа к терминалу

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

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

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


## Интерпретатор командной строки

Интерпретатор командной строки -- это управляющая программа, которая организует взаимодействие пользователя с системой в стиле командной строки.
По другому интерпретатор коротко называют шелом, от английского `shell` (оболочка).
Существуют разные виды интерпретаторов.
В Ubuntu и других Linux-системах по умолчанию используют `bash`.
Кроме него существуют и другие: `sh`, `ksh`, `csh`, `tcsh`, `fish`, `zsh`.
Во всех названиях присутствуют последними символы `sh`, образованные опять же от `shell`.

<!-- Какие задачи выполняет интерпретатор -->
Основная задача интерпретатора состоит в приеме от пользователя командной строки и ее выполнении.
Кроме этого он:
* делает удобным ввод и редактирование строки;
* управляет задачами -- завершает, приостанавливает, переносит из переднего плана на задний и обратно;
* предоставляет язык программирования и исполняет сценарии на этом языке.

Перед вводимой строкой располагается приглашение (prompt), состоящая из имени пользователя и машины, а также текущего каталога:
``` bash
username@hostname:directory$
```
При подключении к машине мы попадаем в домашний каталог, который имеет короткое обозначение `~`.
Строка с приглашением показывает, что интерпретатор ожидает от пользователя ввода команды.

```{warning}
Часто новички недоумевают, почему команды в терминале не выполняются.
Это происходит, когда терминал захвачен другой программой, не интерпретатором.
Именно здесь выручает присутствие строки с приглашением, которая сигнализирует об активности интерпретатора.
```

После того, как команда набрана, нажатием клавиши Enter она разбирается и исполняется.
Выше упоминалась команда `exit`, которая завершет сессию и закрывает окно эмулятора.

Команда `date` выводит на экран текущие дату и время:
```bash
woldemar@skt:~/Projects/sppo$ date
Пн 11 сен 2023 11:06:34 MSK
```

Команда `cal` по умолчанию выводит на экран сгруппированные по дням недели дни текущего месяца.
```bash
woldemar@skt:~/Projects/sppo$ cal
   Сентябрь 2023      
Вс Пн Вт Ср Чт Пт Сб  
                1  2  
 3  4  5  6  7  8  9  
10 11 12 13 14 15 16  
17 18 19 20 21 22 23  
24 25 26 27 28 29 30  
```

Команда `who` перечислит активных пользователей в системе.
Команда `history` выведет на экран ранее выполненные команды.
Команда `clear` очищает экран и перемещает курсор наверх.
Это же действие можно вызвать по клавишам `ctrl-l`.
Команда `ls` выведет на экран список файлов и каталогов в текущем каталоге.

Все команды делятся на три группы:
* системные программы;
* пользовательские программы;
* внутренние команды интерпретатора.

<!-- Системные и пользовательские программы -->
Системные программы от пользовательских отличаются тем, что они расположены в каталогах, перечисленных в системной переменной PATH.
Благодаря этому они могут быть вызваны по имени.
Системные каталоги часто доступны только для чтения, что не позволяет обычному пользователю добавлять туда свои программы.
Все другие программы, не относящиеся к системным, должны быть вызваны по пути к файлу.

<!-- Внутренние команды интерпретатора -->
С внутренними командами интерпретатора не связан отдельный исполняемый файл.
Они являются частью исполняемого файла интерпретатора.
Это позволяет получать им доступ к внутреннему состоянию интерпретатора.
Например, команда `history` относится к ним, так как только интерпретатор знает, какие команды вызывал пользователь.


## Эмулятор терминала GNOME

Быстрый вызов эмулятора происходит комбинацией клавиш `Ctrl+Alt+T` или командой контекстного меню “Открыть в терминале”.
В результате появится окно терминала с темным фоном, мигающим курсором в ожидании пользовательского ввода.

```{figure} images/GNOME-terminal.png
```

<!-- Продвинутые возможности эмулируемого терминала -->
Эмулятору доступны графические средства для отрисовки данных.
Это позволяет делать то, что не доступно в физических и виртуальных терминалах:
* использовать мышь для копирования текста;
* подсвечивать и переходить по гипперссылкам;
* отобразить кириллицу и символы Unicode;
* изменить шрифт, цвет фона и текста;
* настраивать форму и мигание курсора;
* прокручивать экран.

<!-- Взаимодействие с текстом в окне терминала -->
В терминале можно редактировать только набираемую командную строку.
Вывод программ и выполненные строки остаются на экране и постепенно перемещаются наверх.
В эмуляторе текст с помощью мыши можно прокрутить и скопировать.
Строки с гиперссылками при наведении на них подсвечиваются.
Для перехода по ним следует щелкнуть левой кнопкой мышью при нажатой клавише `Ctrl`.

<!-- Отображение символов Unicode -->
Так как ядро Linux для внутреннего представления строк использует UTF-8, то пользователь получает в придачу все символы из базы UNICODE.
Кроме символов алфавита народов мира, сюда входят алфавиты древних письменностей, смайлы, псевдографика, нотные символы и многое другое.
На практике большей частью такие нестандартные символы не понадобятся.
Возможно, они встретятся при просмотре и редактировании текстовых документов, например форматов html, markdown.
Такие редакторы как `vim` и `emacs` правильно отобразят символы при условии, что установлены подходящие файлы шрифтов.

<!-- Профили эмулятора терминала -->
Пользователь терминала может задать цвет фона и параметры отображения текста как шрифт, цвет, начертание и размер символов, поведение курсора и некоторые другие параметры, управляющие отображением данных и поведением терминала.
Эти параметры объединяются в профиль.
Профиль сохраняется под именем и может быть повторно использован.
В рамках одного терминала может быть несколько профилей, активным среди которых только один.
Выбор профиля в терминале GNOME происходит из контекстного меню.

<!-- Вкладки в окне терминала -->
Можно одновременно запустить несколько окон терминала, каждая из которых образует сессию.
Но несколько терминалов можно объединить в одном окне, воспользовавшись вкладками.


## Вопросы для контроля

1. Для чего существует среда рабочего стола?
1. Что такое интерпретатор командной строки?
1. Что общего и чем отличаются среда рабочего стола и интерпретатор командной строки?
1. Как по другому называют интерпретатор командной строки?
1. Чем отличается виртуальный терминал от эмулируемого? Продемонстрируйте их.
1. Чем отличается текстовый терминал от графического?
1. Что происходит при подключении к терминалу?
1. Как быстро вызвать эмулятор терминала?
1. Создайте собственный профиль в `GNOME Terminal`.
1. Какие задачи решает интерпретатор командной строки?
1. Чем отличаются системные программы от пользовательских?
1. Чем отличаются внешние команды от внутренних?
1. Для чего служит строка приглашения?
1. Для чего необходимо имя машины в строке с приглашением?
