Знакомство с командным интерфейсом GNU/Linux #
Андрей Михайлович Васильев, 2023
Версии презентации
Графический пользовательский интерфейс #
Пользователи сейчас приучены к графическому интерфейсу:
- Интерфейсы мобильных устройств, взаимодействие с помощью касания
- Интерфейсы компьютеров, взаимодействие с помощью клавиатуры и мыши
В тоже самое время способны обучаться специализированным устройствам взаимодействия:
- Интерфейсы телевизоров, взаимодействие с помощью пульта
- Интерфейсы игровых консолей, взаимодействие с помощью контроллера
«Продвинутое» использование интерфейса компьютера #
- Использование раздельных графических пространств для разделения приложений по задачам
- Множество приложений, включая интерфейс ОС, предлагают использовать сочетания клавиш для быстрого выполнения действий
- Ряд горячих клавиш становится индустриальным стандартом
Ctrl+/
выполняет комментирование или удаление комментариев исходного кода в интегрированных средах разработки
История компьютерных интерфейсов #
- Перфокарты
- Перфоленты
- Телетайп
- На основании принтера
- С экранным вводом
Общая логика: пользователь формирует запрос, получает ответ.
Со временем цикл получения обратной связи уменьшался и в 80-е годы можно было выполнять интерактивное взаимодействие в текстовой форме с разных терминалов
Что такое командный интерфейс #
CLI, command line interface, командный интерфейс — это способ взаимодействия с ОС, при которой пользователь вводит текстовые команды с клавиатуры, а приложение-интерпретатор их выполняет
Процесс взаимодействия выглядит следующим образом:
- Командный интерпретатор показывает приглашение для ввода
- Пользователь вводит текстовую команду и нажимает «Ввод»
- Командный интерпретатор обрабатывает строку
- Если команда была введена неверно, то интерпретатор сообщит об ошибке
- Если команда была введена корректно, то задача будет выполнена
- Пока команда выполняется, то ввод и вывод передаются команде
- После завершения команды интерпретатор опять показывает приглашение
Почему стоит знать командный интерфейс #
- Данный интерфейс можно запустить на любых вычислительных мощностях
- Действия командного интерфейса очень легко автоматизируются
- При условии минимальных знаний в программировании
- Автоматизировать работу веселее чем вручную выполнять повторяющиеся действия
- Приложения с командным интерфейсом легче разрабатывать
- Таких приложений разработано много
- Приложения зачастую отлично решают конкретную задачу
- Экспериментальные технологии разрабатываются с поддержкой только этого интерфейса
- Удобен для удалённого подключения, т.к. потребляет мало трафика
- Из командного интерфейса можно запускать графические приложения
- Большинство средств разработки имеют доступ к командному интерфейсу, например
~
открывает консоль в CS:GO
Командный интерпретатор #
Командный интерпретатор — это обычное приложение, которое запускается средствами ОС, следовательно под каждой ОС может быть установлено множество таких интерпретаторов
Какие бывают интерпретаторы #
Типичные представители интерпретаторов:
- 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 покажет возможные варианты для дополнения