skip to main content

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

js

Кратко 🔗

Интерфейс командной строки (терминал, консоль, Command line interface, CLI) позволяет человеку взаимодействовать с компьютером с помощью текстовых команд заданного формата. Эти команды указывают, что и в какой последовательности делать. В ответ компьютер может выводить на экран информацию о результатах работы той или иной команды.

Как понять 🔗

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

Запустить терминал можно как обычную программу в вашей операционной системе. На компьютерах Mac эта программа так и называется «Терминал». В операционных системах из семейства Linux терминал установлен по умолчанию и доступен не только в списке программ, но и по сочетанию клавиш Ctrl Alt T. В Windows программа для работы с консолью самой операционной системы установлена по умолчанию, находится в меню Пуск → Все программы → Стандартные и называется «Командная строка». Однако разработчикам больше подойдёт «PowerShell», ну а для полноценной работы лучше использовать WSL (Windows Subsystem for Linux) первой или второй версии. Эта программа позволяет использовать всю мощь командной строки Unix-подобных систем, её можно скачать из магазина приложений Microsoft Store. Процесс установки достаточно подробно описан в официальной документации.

В «Терминале» текстовый интерфейс для пользователя выглядит следующим образом:

Структура интерфейса командной строки

Приглашение командной строки всегда отображается, когда операционная система готова выполнить следующую команду пользователя. В приглашение командной строки можно вывести довольно много разной информации. Обычно в приглашение помещается имя компьютера, терминалом которого вы пользуетесь, и имя текущего пользователя, например: UserName@MyComputer $. Часто, кроме этой информации, может быть явным образом указана текущая директория, например: UserName @ MyComputer in /etc $. Можно изменить цвет текста или поместить дату и время. В приглашении может хранится информация о текущей ветке в системе контроля версий, например: UserName @ MyComputer in /etc $ on git:main. Бывают и обратные ситуации, когда удобно использовать короткое приглашение, чтобы не загромождать интерфейс, например: > или $.

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

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

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

date

Нажмите клавишу Enter, чтобы выполнить команду. Все, что идёт после команды, называется аргументами командной строки. Часть специальных аргументов, которые настраивают работу команды, принято называть ключами (флагами, параметрами). С помощью ключей пользователь может указать, в каком режиме будет работать команда, задать значения по умолчанию и прочее. Ключи, состоящие из нескольких символов, принято обозначать двумя дефисами в начале. Например, для большинства команд можно посмотреть короткую справку с помощью ключа --help. Часто используемые длинные ключи также имеют короткий аналог (псевдоним, alias) из одного символа, например -h для той же справки. Короткие ключи, как правило, можно указывать вместе, поставив перед ними дефис:

  • cal — вывод календаря для текущего месяца с подсвеченной текущей датой
  • cal -h — не подсвечивать текущую дату
  • cal -hj — не подсвечивать текущую дату и заменить числа месяца на номер дня в году
  • cal -hy — не подсвечивать текущую дату и вывести календарь для всего текущего года

Символ # в начале строки используется для однострочного комментария.

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

who

Для большинства стандартных команд существует подробное описание ключей и аргументов. Это описание доступно по команде man (от “manual”). Вы можете посмотреть краткую справку для этой команды так:

man --help
> man, version 1.6g
>
> usage: man [-adfhktwW] [section] [-M path] [-P pager] [-S list]
> [-m system] [-p string] name ...
>
> a : find all matching entries
> c : do not use cat file
> d : print gobs of debugging information
> D : as for -d, but also display the pages
> f : same as whatis(1)
> h : print this help message
> k : same as apropos(1)
> K : search for a string in all pages
> t : use troff to format pages for printing
> w : print location of man page(s) that would be displayed
> (if no name given: print directories that would be searched)
> W : as for -w, but display filenames only
>
> C file : use 'file' as configuration file
> M path : set search path for manual pages to 'path'
> P pager : use program 'pager' to display pages
> S list : colon separated section list
> m system : search for alternate system's man pages
> p string : string tells which preprocessors to run
> e - [n]eqn(1) p - pic(1) t - tbl(1)
> g - grap(1) r - refer(1) v - vgrind(1)

На следующей строке вы видите текущую версию программы, затем идёт описание формата команды. Квадратные скобки указывают на аргумент, который можно использовать, но он не является обязательным. Без квадратных скобок указываются аргументы, которые использовать необходимо. Этого синтаксиса, как правило, придерживаются в любой справочной информации для команд текстового интерфейса. Например name обозначает имя команды, справку о которой мы хотим получить. Для получения справки по команде pwd нужно выполнить:

man pwd

Терминал перейдёт в специальный режим постраничного просмотра, в котором можно перемещаться клавишами , , , , PgUp, PgDown, Home, End. Для того чтобы выйти из этого режима, нажмите клавишу Q. В справке написано, что команда pwd используется для того, чтобы узнать, в какой директории вы сейчас находитесь (рабочая директория). Имя этой команды идёт от аббревиатуры PWD — Present Working Directory. В любом случае вы работаете внутри какой-либо рабочей директории. Среди специальных директорий можно выделить:

  • корневую директорию, которая доступна в /;
  • домашнюю директорию пользователя, доступную в /home/<имя пользователя> или по псевдониму ~;
  • директорию .., которая присутствует во всех директориях и обозначает ссылку на директорию, расположенную на уровень выше;
  • директория ., которая также присутствует во всех директориях и является ссылкой на текущую директорию.

В Unix-подобных системах скрытые директории и файлы помечаются точкой в начале.

Сочетание клавиш Ctrl A позволяет переместиться к началу строки, Ctrl E — к концу. Нажав Ctrl L вы сможете очистить экран, переместив строку приглашения на верх окна. То же самое делает команда clear. Клавиша Tab позволяет использовать автодополнение, например, для имён директорий или файлов. Двойное нажатие позволит посмотреть все доступные варианты. Клавишами , можно перемещаться по списку уже выполненных команд, что бывает очень удобно. Чтобы посмотреть полный список команд, которые были вызваны ранее, выполните:

history

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

Существует довольно много разных терминалов. Самые распространённые для Unix-подобных систем — bash и zsh. Наиболее полный список терминалов можно посмотреть в таблице.

В работе 🔗

Файловая система 🔗

Файловая система в Unix-подобных операционных системах устроена немного иначе, чем в Windows. В ней тоже есть корневая директория и дерево директорий (папок), но есть и особенности. Например, в Linux файлами считается абсолютно все. Даже директория в Linux — это файл со списком файлов, которые в ней расположены, а принтер или монитор представлены в виде файлов, в которые записываются новые символы.

Все эти файлы образуют дерево с корнем в директории /. Для разделения уровней дерева файлов используется символ /. Любое устройство, подключённое к компьютеру, файлы, диски, флэш-накопители, сетевые директории, устройства в сети, мониторы, принтеры, сканеры можно найти в дереве.

Существуют и логические диски но они не обозначаются отдельными буквами, как в Windows. Для доступа в тому или иному логическому диску (разделу) его сначала надо примонтировать, а затем использовать как обычную директорию. Монтирование — процесс помещения файловой структуры внешнего устройства в дерево директорий операционной системы. Процесс монтирования обычно автоматизирован, вам редко придётся использовать специальные команды mount и umount, чтобы примонтировать или отмонтировать какой-либо жёсткий диск, флэш-накопитель или другое устройство. Вы можете управлять местом монтирования (директорией, в которой будет доступна файловая система подключаемого устройства). По умолчанию все подключаемые устройства, как правило, располагаются в /media/ в директории с именем устройства в системе.

Поскольку в Unix-подобных системах всё является файлами, существует довольно богатый функционал для работы с ними в интерфейсе командной строки. Примеры работы с файлами и директориями:

  • ls — вывод списка файлов и поддиректорий;
  • ls -l — c указанием служебной информации;
  • ls -al — c указанием служебной информации и показом скрытых директорий и файлов;
  • mkdir /tmp/new-dir — создание новой директории с указанием абсолютного пути;
  • mkdir -p /tmp/new-dir/new-sub-dir — с ключом -p команда создаст все несуществующие директории;
  • cd /tmp/new-dir — переход в какую-либо директорию по абсолютному пути;
  • cd new-sub-dir — переход в поддиректорию, если она существует;
  • cd .. — переход на уровень вверх;
  • cd ../new-sub-dir/ — переход в какую-либо директорию по относительному пути;
  • cd - — переход в предыдущую рабочую директорию;
  • touch /tmp/new-dir/new-sub-dir/new-file.txt — создание нового пустого файла;
  • cat /tmp/new-dir/new-sub-dir/new-file.txt — вывод содержимого файла на экран;
  • cp /tmp/new-dir/new-sub-dir/new-file.txt /tmp/new-dir/new-sub-dir/file-copy.txt — копирование файла;
  • mv /tmp/new-dir/new-sub-dir/*.txt ../ — перемещение всех файлов с расширением .txt на уровень вверх;
  • rm /tmp/new-dir/file-copy.txt — удаление файла;
  • rm -r /tmp/new-dir — рекурсивное удаление содержимого директории вместе с самой текущей директорией.

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

Чаще всего в директории /home хранятся домашние директории пользователей, в директории /bin — системные утилиты, директория /etc используется для служб, /tmp — для хранения временных файлов, /var — для пользовательских приложений.

В Unix-подобных системах существует понятие ссылки. Это специальный файл, и если вы обращаетесь к нему, то операционная система переадресует вас к целевому файлу или целевой директории. Эта переадресация не является переходом в другое место дерева директорий, это подмена содержимого файла или директории «на лету». Ссылки бывают символическими, или мягкими (symbolic links), и жёсткими (hard links). Символические ссылки ближе всего к ярлыкам. При удалении целевого файла ссылка остаётся. Жёсткие ссылки существуют на более глубоком уровне файловой системы, это своеобразный синоним файла (директории). Они указывают на сам файл (директорию), а не на путь, как это реализовано для символических ссылок. При перемещении целевого файла жёсткая ссылка остаётся рабочей. Разница показана на рисунке:

Типы ссылок в Unix-подобных системах

Чтобы управлять ссылками, воспользуйтесь командами:

  • ln /tmp symlink — создание жёсткой ссылки;
  • ln -s /tmp symlink — создание символической ссылки;
  • ls -li — вывести информацию о ссылках (для символических будет указан путь).

Доступ и пользователи 🔗

Изначально при проектировании операционной системы Unix был заложен принцип «Что не разрешено, то запрещено». Поскольку любая сущность является файлом, этот принцип означает, что по умолчанию в Unix-подобных операционных системах доступ ко всем файлам запрещён для всех пользователей, кроме суперпользователя с именем root. В дальнейшем с появлением пользователей в операционной системе им предоставляют права для отдельных объектов. На таком последовательном процессе построена безопасность использования. Работа от имени суперпользователя не рекомендуется. Вместо этого можно использовать специальный режим, выполняя команды от имени суперпользователя:

sudo <команда> <аргументы>
> Password:

Возможность работы от имени root доступна не всем пользователям, а только тем, которые находятся в специальном списке. Редактировать список, а также другие параметры команды sudo можно с помощью редактора vi, выполнив команду:

sudo visudo

В Unix-подобных операционных системах доступ к файлам основан на ACL. Доступ получает не сам пользователь, а процесс (приложение, служба). Например, чтобы прочитать содержимое файла, используется программа для чтения cat.

У каждого процесса есть идентификатор UID (User IDentifier), который указывает на пользователя, от имени которого процесс запущен. UID — это число, однозначно связанное с именем пользователя. Каждый пользователь входит в одну или несколько групп, у каждой из которых тоже есть идентификатор GID (Group IDentifier). Одному числу UID соответствует список GID.

У каждого файла есть не только идентификатор пользователя UID, который используется для указания владельца файла, но и идентификатор группы GID — для группы владельцев. Установить имя пользователя и имя группы, которые будут владельцами файла, можно с помощью команды:

chown user:group file.txt

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

Схема проверки доступа к файлу или директории

Для установки прав доступа к файлу владельца, группы владельцев или любого пользователя применяется последовательность символов -, r, w, x (от слов read, write, execute) или трёх цифр от 0 до 7 (восьмеричная система счисления). Соответствие символов и цифр представлено в таблице:

ЦифраСимволПраваПрименение
0---ничего нельзяДоступ к файлу запрещён
1--xзапускЗапуск приложения / открытие директории
2-w-изменениеМожно менять содержимое
3-wxзапуск + изменениеКомбинация прав доступа
4r--чтениеЕсть доступ на чтение
5r-xчтение + запускКомбинация прав доступа
6rw-чтение + изменениеКомбинация прав доступа
7rwxвсе можноПолный доступ

Используется команда:

chmod 754 file.txt

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

chmod -rwxr-xr-- file.txt

Последовательность символов важна: r может стоять только на первом месте, w — на втором, а x — на третьем. Первый символ - в начале строки параметров -rwxr-xr-- показывает, что перед нами файл. При вызове команды для вывода списка содержимого папки для отображения настроек доступа будет использоваться именно эта символьная запись:

ls -l

Если первый символ в настройках доступа d, то перед нами директория, если l, то — ссылка на другой файл или папку.

Цифры переводятся в восьмеричную систему счисления из флагов, записанных в двоичной системе. Если вы будете пользоваться цифрами, то легко запомнить, что положение букв в символьной записи и чисел двоичного кода связано. Например, выражение rw- является аналогом 110, что в восьмеричной системе будет равно 6. Вы можете посмотреть полный список в таблице.

Таким образом каждому файлу ставится в соответствие владелец и группа владельцев (UID и GID), а также три числа для указания прав, которые есть у владельца (UID), группы владельцев (GID) и всех остальных пользователей. Чтобы узнать имя вашего пользователя, выполните:

whoami

Управлять пользователями и группами пользователей в операционных системах семейства Linux можно с помощью набора команд:

  • useradd <username> — создание нового <username> пользователя;
  • cut -d: -f1 /etc/passwd — посмотреть всех пользователей;
  • passwd — изменение пароля пользователя;
  • usermod -a -G <usergroup> <username> — добавление пользователя <username> в группу пользователей <usergroup>;
  • groups — посмотреть все группы, в которых состоит пользователь.

Продвинутый уровень использования CLI 🔗

Если что-то пошло не так (например, поехали шрифты или временно применились не те настройки), можно ещё раз инициализировать терминал без его перезагрузки:

reset

Выполненную ранее команду можно найти, нажав Ctrl R (на некоторых операционных системах Ctrl Shift R) и введя несколько символов. После этого наиболее подходящая команда будет показана. Если вы нажмёте Enter, то она выполнится, если воспользуетесь стрелками , , то можно будет её отредактировать. Повторное нажатие сочетания клавиш Ctrl R (на некоторых операционных системах Ctrl Shift R) продолжит поиск, и будут показаны другие варианты, подходящие под поисковый запрос. Работать с предыдущими командами можно несколькими способами. Примеры:

Выполнить предыдущую команду:

ls -al /etc
> ...

!!
> ls -al /etc
> ...

Использовать текст предыдущей команды:

mkdir -p ~/test/cli/last-cmd

!!/double
> mkdir -p ~/test/cli/last-cmd/double

Использовать при отказе в доступе:

touch ~/test/cli/example.txt

sudo chmod 700 ~/test/cli/example.txt

sudo chown root:root

rm ~/test/cli/example.txt -y
> ... Access denied

sudo !!

Заменить части текста в предыдущей команде:

mkdir -p ~/test/cli/change

mv ~/test/cli/chang ~/
> ...doesn't exist

^g^ge
> mv ~/test/cli/change ~/

Можно работать и с аргументами предыдущей команды.

Использовать значения последнего аргумента:

mkdir -p ~/test/cli/last-arg

cd !$

Создать директории с похожим именем:

mkdir project

mkdir !$-1

ls
> ...

Выполнить несколько команд подряд можно так:

cd ~/test/cli && mkdir test1 && cd test1 && touch test.txt && ls -l

В терминале существует два режима работы: приоритетный (по умолчанию) и фоновый. В первом терминал ожидает завершения работы очередной команды и только после её завершения выводит приглашение командной строки для выполнения следующей команды. Фоновый режим позволяет не дожидаться завершения работы команды. Иногда это бывает полезно, например при длительных операциях. Выполнить команду в фоновом режиме можно так:

Разархивация большого архива в приоритетном режиме:

tar xf archive.zip

Разархивация большого архива в фоновом режиме:

tar xf archive.zip &
> [<number>] <PID>

<number> — номер фонового процесса. Число, которое соответствует <PID>, можно использовать для мониторинга и управления. Пример:

  • jobs — вывести список фоновых процессов;
  • fg — перевести последний запущенный фоновый процесс в приоритетный режим;
  • fg <number> — перевести фоновый процесс под номером <number> в приоритетный режим.