Знакомство с командным интерфейсом GNU/Linux

Знакомство с командным интерфейсом GNU/Linux #

Андрей Михайлович Васильев, 2023

Версии презентации


Графический пользовательский интерфейс #

Пользователи сейчас приучены к графическому интерфейсу:

  • Интерфейсы мобильных устройств, взаимодействие с помощью касания
  • Интерфейсы компьютеров, взаимодействие с помощью клавиатуры и мыши

В тоже самое время способны обучаться специализированным устройствам взаимодействия:

  • Интерфейсы телевизоров, взаимодействие с помощью пульта
  • Интерфейсы игровых консолей, взаимодействие с помощью контроллера

«Продвинутое» использование интерфейса компьютера #

  • Использование раздельных графических пространств для разделения приложений по задачам
  • Множество приложений, включая интерфейс ОС, предлагают использовать сочетания клавиш для быстрого выполнения действий
  • Ряд горячих клавиш становится индустриальным стандартом
    • Ctrl+/ выполняет комментирование или удаление комментариев исходного кода в интегрированных средах разработки

История компьютерных интерфейсов #

  • Перфокарты
  • Перфоленты
  • Телетайп
    • На основании принтера
    • С экранным вводом

Общая логика: пользователь формирует запрос, получает ответ.

Со временем цикл получения обратной связи уменьшался и в 80-е годы можно было выполнять интерактивное взаимодействие в текстовой форме с разных терминалов


Что такое командный интерфейс #

CLI, command line interface, командный интерфейс — это способ взаимодействия с ОС, при которой пользователь вводит текстовые команды с клавиатуры, а приложение-интерпретатор их выполняет

Процесс взаимодействия выглядит следующим образом:

  1. Командный интерпретатор показывает приглашение для ввода
  2. Пользователь вводит текстовую команду и нажимает «Ввод»
  3. Командный интерпретатор обрабатывает строку
    • Если команда была введена неверно, то интерпретатор сообщит об ошибке
    • Если команда была введена корректно, то задача будет выполнена
  4. Пока команда выполняется, то ввод и вывод передаются команде
  5. После завершения команды интерпретатор опять показывает приглашение

sequenceDiagram actor user as Пользователь participant interp as Интерпретатор participant process as Приложение interp ->> user: Показывает приглашение для ввода user ->> interp: Вводит текст команды, наживет «Ввод» interp ->> interp: Обрабатывает ввод от пользователя alt Команда неверна interp ->> user: Сообщение об ошибке ввода else Команда введена верно interp ->> process: Запускает процесс process ->> user: Интерактивное взаимодействие end

Почему стоит знать командный интерфейс #

  • Данный интерфейс можно запустить на любых вычислительных мощностях
  • Действия командного интерфейса очень легко автоматизируются
    • При условии минимальных знаний в программировании
    • Автоматизировать работу веселее чем вручную выполнять повторяющиеся действия
  • Приложения с командным интерфейсом легче разрабатывать
    • Таких приложений разработано много
    • Приложения зачастую отлично решают конкретную задачу
    • Экспериментальные технологии разрабатываются с поддержкой только этого интерфейса
  • Удобен для удалённого подключения, т.к. потребляет мало трафика
  • Из командного интерфейса можно запускать графические приложения
  • Большинство средств разработки имеют доступ к командному интерфейсу, например ~ открывает консоль в CS:GO

Командный интерпретатор #

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

flowchart TB user["Пользователь"] interpreter("Командный интерпретатор") os("Операционная система") user -- Отправка команды --> interpreter interpreter -- Изменение внутреннего\nсостояния --> interpreter interpreter -- Выполнение системных вызовов \n запуск процессов --> os

Какие бывают интерпретаторы #

Типичные представители интерпретаторов:

  • Windows: cmd, PowerShell, bash (порт) и т.д.
  • MacOS: bash, zsh и т.д.
  • Linux: bash, zsh, fish, dash и т.д.

Мы будем рассматривать Bash, Bourne Again Shell, названного в честь создателя оригинального приложения sh Стива Борна

Данный интерпретатор устанавливается по умолчанию в большинстве дистрибутивов GNU/Linux, ранее тоже был интерпретатором по умолчанию для macOS


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

Для работы с командным интерпретатором необходимы приложения — эмуляторы терминала

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

Примеры терминалов под разные операционные системы:

  • Windows: ConEmu, Mintty, Windows Terminal
  • GNU/Linux: gnome-terminal, console, terminator, xfce4-terminal, xterm
  • macOS: Terminal, iTerm2

Linux также обеспечивает возможность работы с интерпретатором без графического интерфейса. Классический вид терминала доступен с помощью сочетания клавиш Ctrl+Alt+F1 (F2, F3, …)


Разбор приглашения командного интерпретатора #

Каждое хорошее интерактивное приложение должно показывать пользователю, что оно ожидает от него ввод команды

Типичный вид приглашения Bash:

[andrey@home-pc ~]$
  • andrey — имя пользователя, с правами которого будут выполняться команды
  • @ — разделительный знак, обозначающий на
  • home-pc — название компьютера, на котором находится компьютер
  • ~ — текущий рабочий каталог
  • $ — уровень прав текущего пользователя, $ — обычный пользователь, # — суперпользователь

Другое типичное приглашение:

bash-4.4$

Чтение ответов от команд #

Давайте введём некорректную команду aoeucrg:

andrey@home-pc:~$ aoeucrg

В результате обработки команды bash сообщит, что команда неверна:

bash: aoeucrg: команда не найдена
andrey@home-pc:~$

Не стоит рассчитывать, что вы «ввели всё правильно» и «оно должно было правильно отработать» — всегда читайте результат работы команды

Классические приложения UNIX не выводят ничего, если они выполнили свою задачу без ошибок


Базовое взаимодействие с командным интерпретатором #

При вводе команды её можно редактировать:

  • Клавиши влево и вправо позволяют передвигать курсор
  • Работают клавиши Delete и Backspace
  • Есть ряд других горячих клавиш, упрощающие передвижение курсора

Последние 1000 введённых команд хранятся в истории. Клавиши вверх-вниз позволяют двигаться по истории команд. Команду из истории можно редактировать


Решение проблемы при вводе команды #

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

Плохой подход к решению: при возникновении проблемы начать вводить команду заново

Правильный подход к решению: если в команде была ошибка, тогда надо вызвать из истории последнюю команду (нажать клавишу вверх), отредактировать её и выполнить заново


Ряд рабочих команд #

date — получение информации о текущей дате и времени

andrey@home-pc:~$ date
Ср 02 сен 2020 11:19:38 MSK

Ср 02 сен 2020 11:19:38 MSK является результатом работы команды date

После выполнения команды командный интерпретатор опять запрашивает ввод:

andrey@home-pc:~$ date
Ср 02 сен 2020 11:19:38 MSK
andrey@home-pc:~$

cal и ncal — приложения для отображения календарей на месяц или год

andrey@home-pc:~$ cal
    Сентябрь 2020
Пн     7 14 21 28
Вт  1  8 15 22 29
Ср  2  9 16 23 30
Чт  3 10 17 24
Пт  4 11 18 25
Сб  5 12 19 26
Вс  6 13 20 27

df — отображение информации о занятом дисковом пространстве

andrey@home-pc:~$ df -h
Файловая система Размер Использовано  Дост Использовано% Cмонтировано в
/dev/sdd3          111G          56G   56G           51% /
/dev/sde1          466G         384G   82G           83% /home
/dev/sdd2          454M          89M  362M           20% /boot

free — информация об использовании оперативной памяти

andrey@home-pc:~$ free
              total        used        free      shared  buff/cache   available
Mem:       32889440     6600560     6774420      337268    19514460    25557628
Swap:      16777212           0    16777212

Завершение работы терминала #

Для окончания работы терминала достаточно либо ввести команду exit, либо при пустой командной строке наберите сочетание клавиш Ctrl-D (Нажать Ctrl и не отпуская её нажать на клавишу d)


Навигация в файловой системе #

При работе за компьютером пользователи постоянно взаимодействуют с файловой системой:

  • Приложение — это файл, который располагается где-то в файловой системе
  • Все данные пользователя расположены в файлах: текстовые документы, фотографии, таблицы и так далее
  • Приложения для своей работы используют разделяемые библиотеки, файлы, различные ресурсы (тоже файлы)
  • Приложения используют файлы для хранения собственной конфигурации

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


Структура файловых каталогов #

В большинстве ОС для организации дискового пространства используется иерархическая структура каталогов:

  • Единицей организации данных является каталог, который может содержать другие файлы и каталоги
  • Первый каталог файловой системы называется корневым
  • В результате формируется древовидная структура файловой системы

В Windows существует множество файловых деревьев, для идентификации которых используются названия C, D и так далее

В UNIX-подобных ОС существует только одно дерево каталогов, различные дисковые разделы подключаются к единому дереву каталогов, начиная с корневого каталога /


Текущий рабочий каталог #

Для удобства построения путей к нужным файлам была введена концепция текущего рабочего каталога

Без её помощи можно стоить пути только абсолютно, начиная с корневого каталога /

/home/user/my-data/marks.ods

Это соответствует следующей структуре каталогов

/
└── home
    └── user
        └── my-data
            └── marks.ods

С помощью рабочего каталога можно сократить вводимый пользователем путь:

marks.ods

Эти пути будут указывать на один и тот же файл, если текущий рабочий каталог

/home/user/my-data/

Относительный путь #

Путь к файлу = текущий рабочий каталог + относительный путь

/home/user/my-data/ + marks.ods = /home/user/my-data/marks.ods

Относительные пути значительно сокращают скорость работы с нужными файлами, если их правильно применять

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

Как узнать текущий рабочий каталог #

Команда pwd позволяет узнать текущий рабочий каталог

andrey@hp-laptop:~$ pwd
/home/andrey

/home/andrey — это вывод команды pwd


Как указывать относительные пути к другим каталогам #

Согласно древовидному представлению мы можем двигаться в трёх направлениях:

  • Вверх, к родительскому каталогу
  • Остаться на месте в текущем каталоге
  • Вниз, в один из подкаталогов

Вверх #

Для движения «вверх» необходимо использовать специальный путь: ..

Например для составления пути к файлу data.txt в родительском каталоге необходимо составить относительный путь ../data.txt

Родительский каталог/
├── Рабочий каталог/
│   ├── cute-animals/
│   │   └── cat.png
│   └── picture.png
└── data.txt

Остаться на месте #

Для указания текущего каталога используется специальное название: .

Для указания пути к файлу picture.jpg в текущем каталоге следующие формы будут одинаковыми:

  • ./picture.jpg
  • picture.jpg
Родительский каталог/
├── Рабочий каталог/
│   ├── cute-animals/
│   │   └── cat.png
│   └── picture.png
└── data.txt

Спуститься вниз в один из подкаталогов #

Для указания пути к файлу cat.png, расположенному в подкаталоге cute-animals необходимо сформировать: cute-animals/cat.png

Родительский каталог/
├── Рабочий каталог/
│   ├── cute-animals/
│   │   └── cat.png
│   └── picture.png
└── data.txt

Отображение файлов в каталоге #

Для получения информации о файлах в каталоге используется приложение ls

andrey@hp-laptop:~$ ls
 bin           Desktop   Documents     libvirt-images   Postman
 snap ...

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


Аргументы #

В самом простейшем случае команду можно описать следующим образом:

приложение аргумент-1 аргумент-2 аргумент-3
  • Введённая строка разделяется на слова, делением на пробелы
  • Первое слово — название приложения, которое необходимо запустить
  • Последующие слова передаются приложению для

Рассмотрим стартовую функцию приложения, написанного на языке Си:

int main(int argc, char *argv[]) {
    ...
}
  • argc — количество переданных аргументов
  • argv — массив строк, содержащих аргументы

Скрытые файлы в UNIX #

Согласно соглашению об именах файлы, которые начинаются с символа точки, считаются скрытыми и их приложение ls в своём выводе по умолчанию не показывает

Чтобы увидеть все файлы, включая скрытые необходимо приложению ls передать аргумент -a: ls -a

[andrey@hp-laptop ~]$ ls -a
 .  ..  .bash_history  .bash_logout  .bash_profile  .bashrc  .cache
 .config  .local .lpoptions  .mutt  .psql_history  .rpmmacros  .ssh
 .wget-hsts  .xprofile  .xsession.d ...
  • Скрытые файлы зачастую содержат конфигурационные файлы приложений
  • Пользователю редко необходимо эти файлы редактировать

Изменение текущего рабочего каталога #

Для изменения текущего рабочего каталога используется команда cd

Для перехода в другой каталог необходимо в качестве аргументу команды cd передать либо абсолютный, либо относительный путь к целевому каталогу

Пример структуры каталогов

/
└── usr
    ├── bin
    ├── doc
    ├── lib
    ├── sbin
    └── share

Использование абсолютных путей

С помощью абсолютного пути можно перейти в целевой каталог из любого места файловой системы

Для перехода в /usr/bin можно написать

cd /usr/bin

Изменение рабочего каталога с относительными путями #

При использовании относительных путей экономим время на набор, но надо быть аккуратным - путь зависит от текущего рабочего каталога

Предположим, что мы находимся в каталоге /usr/bin проведём ряд переходов

Пример структуры каталогов

/
└── usr
    ├── bin
    ├── doc
    ├── lib
    ├── sbin
    └── share
$ pwd
/usr/bin
$ cd .. # Переход в /usr
$ pwd
/usr
$ cd lib # Переход в /usr/lib
$ pwd
/usr/lib
$ cd ../share # Переход в /usr/share
$ pwd
/usr/share

Специальные аргументы команды cd #

Команда cd может также принимать следующие специальные аргументы:

  • - — переход в предыдущий каталог
  • без аргументов — переход в домашний каталог
  • ~bob — переход в домашний каталог пользователя bob

Также можно воспользоваться ~ для указания пути к домашнему каталогу текущего пользователя. Данный путь будет работать везде, не только с командой cd


Особенности файловой системы Linux #

Имена файлов и каталогов зависят от регистра #

Следующие наборы имён в Linux будут разными в отличие от Windows и macOS:

  • File.txt, file.txt
  • DataBase.db, database.DB

Командный интерфейс не различает расширения файлов #

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

В командном интерфейсе реализована другая логика: необходимо вызвать приложение и указать ему файл, который необходимо обработать

Можно вызвать приложение, которое автоматически найдёт приложение по расширению или типу файла, т.е. «нажать» на файл из командного интерфейса


Пробелы в названий файлов и каталогов #

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

Предположим, что мы хотим перейти в каталог с названием cool things и напишем команду cd cool things

Данная команда не будет успешна, т.к. для cd будет передано 2 аргумента: cool и things, а не один

Для решения этой задачи надо либо экранировать пробел:

  • С помощью кавычек: cd 'cool things'
  • С помощью слеша: cd cool\ things

Либо по возможности избегать пробелов в названиях файлов


Автоматическое дополнение пути #

Может показаться, что формировать длинные пути сложно с клавиатуры и неудобно, но это не так. Для ускорения процесса можно воспользоваться клавишей <TAB>, которая позволяет автоматически разрешить путь к каталогу

Рассмотрим следующую структуру каталогов

И построим путь к каталогу path

.
├── another
└── some
    ├── complex
    │   ├── path
    │   └── picture
    └── data
$ cd # начинаем набирать команду cd
$ cd s # нажимаем TAB
$ cd some/ # дополнение
$ cd some/c # вводим c и TAB
$ cd some/complex/ # дополнение
$ cd some/complex/pa # TAB
$ cd some/complex/path

В последнем шаге потребовалось ввести pa, а не p, т.к. существует 2 каталога, которые начинаются на букву p

Если автоматическое дополнение не сработало сразу, то можно нажать на клавишу <TAB> ещё раз и Bash покажет возможные варианты для дополнения

© A. M. Васильев, 2024, CC BY-SA 4.0, andrey@crafted.su