3.2. Как устроены команды, переменные окружения и где искать справку
Автор: Кирилл Шевчук
В этой статье мы научимся разбирать команды в терминале: из каких частей они состоят и как правильно читать их синтаксис.
Мы посмотрим, где искать сами команды, познакомимся с переменными окружения и разберёмся, как пользоваться встроенной справкой — от коротких подсказок до подробных руководств.
Ключевые вопросы статьи
- Как выглядит общий формат команды в терминале?
- Где система ищет команды и как это связано с переменными окружения?
- Как создать переменную окружения и зачем?
- Где взять помощь по работе с командой?
Общий формат команды
В предыдущей статье мы познакомились с несколькими командами и даже запустили их в терминале. Давайте посмотрим, из чего они состоят.
Каждая команда в терминале описывается по одному и тому же принципу:
man ls в терминале
- Команда — это имя программы или скрипта, которые вы запускаете.
- Опции (или
флаги) добавляются к команде и меняют её поведение. - Аргументы — это данные, с которыми команда должна работать: путь к файлу, имя каталога, текст для поиска и так далее.
Например, когда в предыдущей статье мы использовали команду echo:
alice@ubuntu:~$ echo "Hello, world!"
echo— это команда, которую мы запускаем."Hello, world!"— это аргумент, с которым запустилась команда.- Мы не использовали никаких опций, хотя они доступны для команды
echo.
Давайте посмотрим на другую полезную команду, которая называется ls. Она позволяет вывести список всех файлов по указанному нами пути.
Что такое путь, мы узнаем в одном из следующих статей. Пока просто запомните, что путь — это адрес к файлу или к папке в файловой системе.
- Если путь не указан,
lsпокажет содержимое текущей папки. - Если мы укажем путь явно, то команда отобразит содержимое указанного каталога.
alice@ubuntu:~$ ls -l /etc
ls— это команда для вывода списка файлов и каталогов;-l— одна из опций, меняющих поведение, здесь она позволяет получить список файлов в расширенном виде;/etc— аргумент, где именно мы хотим посмотреть список файлов, в данном случае — в каталоге/etc.
Вывод этой команды будет длинным, вы заметите большое количество файлов примерно следующего вида:
...
-rw-r--r-- 1 root root 191 Mar 31 20:24 libaudit.conf
drwxr-xr-x 3 root root 4096 Jun 5 12:54 libblockdev
drwxr-xr-x 2 root root 4096 Jun 5 12:55 libibverbs.d
drwxr-xr-x 2 root root 4096 Jun 5 12:55 libnl-3
-rw-r--r-- 1 root root 13 Jun 5 12:55 locale.conf
-rw-r--r-- 1 root root 9563 Sep 5 04:08 locale.gen
...
Не стоит пугаться — давайте разберём, что именно мы получили.
Этот вывод состоит из нескольких частей:
-rw-r--r--— права доступа к файлу;1— количество ссылок на файл;root— владелец файла и группа, которой принадлежит файл;191— размер файла в байтах;Mar 31 20:24— дата и время последнего изменения;libaudit.conf— имя файла.
Важно
Подробнее о том, что означают права доступа и владельцы для файла, мы расскажем в разделе 4.
Ещё один пример — с командой mkdir, которая позволяет создавать новые пустые каталоги:
alice@ubuntu:~$ mkdir -p a/b/c
mkdir— команда для создания каталогов;-p— опция, которая позволяет создавать вложенные каталоги;a/b/c— аргумент (путь из нескольких вложенных каталогов, который мы хотим создать).
Такой формат — команда [опции] [аргументы] — универсален: почти все команды в Linux следуют этой структуре.
Чем различаются опции и аргументы
При разборе команды важно понимать разницу между опциями и аргументами.
Опции (или флаги) управляют тем, как команда выполняет действие.
Обычно они начинаются с одного (-l) или двух (--help) дефисов.
Примеры:
ls -a— показать скрытые файлы;grep --ignore-case— искать без учёта регистра.
Аргументы указывают, с чем команда должна работать.
Это может быть имя файла, путь к каталогу, строка для поиска.
Примеры:
ls /etc— вывести содержимое каталога/etc;grep "main" file.c— искать словоmainв файлеfile.c.
Обычно опции можно комбинировать, а аргументы перечислять по несколько подряд через пробел. Например:
alice@ubuntu:~$ ls -lh /var/log /etc
-lhравносильно-l -h— опции (мы хотим получить подробный список и в удобном формате);/var/logи/etc— два аргумента (каталоги, содержимое которых нужно показать).
Важно
Запомните: сначала идут опции, а затем аргументы. Опции меняют поведение команды, аргументы задают объекты для работы.
Расположение команд
Чтобы понять, как оболочка ищет и запускает команды, нужно разобраться, где они хранятся и какие параметры управляют их поиском. Эти параметры как раз задаются переменными окружения.
Переменные окружения
Переменные окружения — это значения, которые оболочка и программы используют для своей работы. Они хранят сведения о вашем пользователе, системе или полезных настройках.
Прочитать значение переменной окружения можно, добавив знак $ в начало имени переменной.
Примеры часто используемых переменных:
$HOME— путь к домашнему каталогу текущего пользователя;$USER— имя текущего пользователя;$SHELL— оболочка, которая используется по умолчанию;$PATH— список каталогов, где система ищет команды.
Давайте посмотрим значение переменной окружения $HOME. Воспользуемся для этого командой echo:
alice@ubuntu:~$ echo $HOME
Результат:
/home/alice
/home/alice — это полный путь домашнего каталога нашего текущего пользователя, и он хранится в переменной для быстрого доступа — например, в программах и скриптах.
Важно
Обратите внимание: команда echo может выводить не только текст, который ей передадут в качестве аргумента, но и значения переменных.
Попробуем прочитать значения других переменных.
echo $USER
alice
Переменная окружения $USER хранит имя текущего пользователя, под которым вы вошли в систему. Прочитать переменную $USER — это быстрый способ узнать своё имя в системе и использовать его в скриптах и программах.
Например, мы можем создать файл с именем текущего пользователя, не зная его:
alice@ubuntu:~$ touch $USER.txt
alice@ubuntu:~$ ls
alice.txt
Что за команда touch ?
Она позволяет создать пустой файл либо обновить дату изменения файла, если указанный в аргументе файл уже существует.
Команда очень полезна, если нужно быстро создать один файл (или несколько), предсоздать пустой файл в конкретном каталоге, проверить саму возможность создания файлов в каталоге (достаточно ли у нас прав для этого).
Подробнее о файлах и командах для работы с ними мы ещё поговорим в одной из статей дальше.
Переменная $SHELL указывает путь к программе-оболочке, которая используется по умолчанию для вашего пользователя. /bin/bash говорит о том, что мы используем именно оболочку Bash.
alice@ubuntu:~$ echo $SHELL
/bin/bash
Используется эта переменная также в скриптах и программах: например, мы можем не знать, какую именно оболочку использует пользователь, но можем прочитать переменную $SHELL и отталкиваться от этого.
Переменная окружения $PATH и расположение команд
Когда вы вводите команду в терминале, оболочка должна понять, какую программу запустить. Для этого она ищет исполняемые файлы в специальных каталогах, перечисленных в переменной окружения под названием $PATH.
Мы уже знакомы с другими переменными окружения, но давайте посмотрим значение переменной $PATH:
alice@ubuntu:~$ echo $PATH
Результат будет выглядеть так:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
Здесь перечислены каталоги с программами, и разделены они двоеточиями (:).
В практическом смысле это означает, что, когда вы вводите, например, команду ls:
alice@ubuntu:~$ ls
оболочка последовательно проверяет, есть ли программа ls в каталоге /usr/local/sbin, затем — в /usr/local/bin, затем — в /usr/sbin и так далее. Как только команда найдена — она будет запущена.
Поиск команды ls
Чтобы узнать, где именно находится та или иная команда, можно использовать команду which:
alice@ubuntu:~$ which ls
Ответ будет следующим:
/usr/bin/ls
Попробуйте найти расположение уже известных вам команд при помощи which.
Команда which тоже существует и располагается в своём каталоге, что мы можем проверить — вы угадали — командой which:
alice@ubuntu:~$ which which
/usr/bin/which
Есть нюанс: утилита which показывает только первый найденный в $PATH файл, а их может быть и несколько!
Чтобы обнаружить все найденные совпадения в том порядке, в котором оболочка ищет их в $PATH, можно воспользоваться командой type -a <команда>.
Например:
alice@ubuntu:~$ type -a date
date is /usr/bin/date
date is /bin/date
Таким образом, переменная $PATH определяет список каталогов, в которых система ищет исполняемые файлы. Если программа лежит вне этих каталогов, её нужно запускать по полному пути или добавить каталог, в котором находится программа, в переменную $PATH.
Полный путь — это адрес файла, начинающийся от корня файловой системы (/) и включающий все вложенные папки до самого файла.
Например:
/bin/ls
/usr/local/bin/python3
/home/user/Documents/report.txt
Результат, который мы получаем, выполняя команду which, — это тоже пример полного пути.
Попробуйте запустить программу which по полному пути, который вы нашли ранее при помощи команды which:
alice@ubuntu:~$ /usr/bin/which which
/usr/bin/which
Система успешно выполняет программу по полному пути, так же как по её «короткому» имени.
А теперь попробуйте найти полный путь для команды date и так же запустите её по полному пути.
Создание переменных окружения
Вы можете создавать и менять переменные окружения. Например, следующая команда создаст новую переменную с именем MYVAR:
alice@ubuntu:~$ MYVAR="Hello"
И теперь эту переменную можно прочитать при помощи echo:
alice@ubuntu:~$ echo $MYVAR
Hello
Вам может потребоваться создать собственную переменную для хранения часто используемых значений — например, чтобы не набирать длинный путь или команду каждый раз.
alice@ubuntu:~$ MYVAR="/usr/bin/which which"
alice@ubuntu:~$ $MYVAR
/usr/bin/which
Мы сохранили команду с аргументом в переменную и затем обратились к ней при помощи $. В результате нам не нужно печатать команду с нуля — мы просто можем вызывать переменную!
Примечание
Важно: переменные, которые мы создали таким образом, действуют только в текущей сессии. Если мы завершим терминальную сессию, а потом подключимся обратно — переменные окружения исчезнут. Но их можно сохранить при помощи файлов .bashrc или .bash_profile, и об этом пойдёт речь в разделе 4.
Попробуйте создать собственную переменную и вывести её значение через команду echo. А теперь попробуйте сохранить в переменную какую-нибудь полезную команду и вызовите её.
Помощь по работе с командой
В Linux у каждой команды есть встроенная справка. Это самый быстрый способ узнать, что команда делает, какие опции поддерживает и какие аргументы принимает.
Короткая справка: --help
Многие команды поддерживают опцию --help. Она выводит список поддерживаемых опций и примеры использования:
alice@ubuntu:~$ ls --help
Возвращает:
Usage: ls [OPTION]... [FILE]...
List information about the FILEs (the current directory by default).
Sort entries alphabetically if none of -cftuvSUX nor --sort is specified.
Mandatory arguments to long options are mandatory for short options too.
-a, --all do not ignore entries starting with .
-A, --almost-all do not list implied . and ..
--author with -l, print the author of each file
-b, --escape print C-style escapes for nongraphic characters
--block-size=SIZE with -l, scale sizes by SIZE when printing them;
e.g., '--block-size=M'; see SIZE format below
Такой способ удобен, когда нужно быстро вспомнить флаг или понять базовый синтаксис команды.
Попробуйте получить справку для любой из команд, которую вы уже знаете. Посмотрите, какие опции можно использовать, и попробуйте их применить при вызове команды.
Например, команда ls обладает большим количеством возможных опций, которые влияют на формат отображения списка файлов, — вы уже знаете опции -l и -h, но есть и другие!
Важно
У команды может быть список и «коротких», и «длинных» форм опций. Иногда они могут совпадать и делать одно и то же, как, например, ls -a и ls --all, которые выводят все файлы и каталоги, включая скрытые.
Подробная справка: man
Для подробной информации можно использовать встроенные man-страницы (от англ. manual — руководство). Команда man появилась ещё в ОС Unix в 70-х и до сих пор остаётся важным источником справки:
alice@ubuntu:~$ man ls
Как выглядит интерфейс man в терминале:
man ls в терминале
man содержит подробное описание команды, список всех опций и примеры. Чтобы работать со страницей man, используйте клавиши:
- стрелочки ↑ и ↓ — построчное пролистывание по странице;
/— поиск по тексту;n— переход к следующему совпадению;q— выход;Space— быстрое пролистывание вниз по странице.
Важно
Попробуйте открыть man для команды ls и найти слово reverse.
Если вы оказались в ситуации без доступа в интернет или просто хотите найти нужный флаг для вашей команды — --help и man позволят вам разобраться.
Практическая работа: команды, переменные и пути
Теперь, когда вы знаете, из каких частей состоит команда и где система ищет программы, попробуем всё это применить на практике.
Шаг 1. Проверим, кто мы и где находимся:
echo $USER
echo $HOME
echo $SHELL
Шаг 2. Найдите, где находится команда echo:
which echo
Шаг 3. Выполните команду echo по её полному пути:
/usb/bin/echo "It Works!"
Шаг 4. Создайте собственную переменную, хранящую ваше имя:
MYNAME="Ivan"
Шаг 5. Теперь выведите приветствие, используя переменную:
echo "Hello, $MYNAME!"
Что дальше
В следующей статье вы узнаете:
- Как работает автозаполнение и чем оно помогает.
- Как просматривать и использовать историю команд.
- Полезные в работе комбинации клавиш.
- Что такое алиасы.
После этого вы сможете работать в терминале ещё быстрее и проще.
Ключевые выводы по статье
- Каждая команда в терминале имеет общий формат:
имя команды → опции → аргументы.- Переменные окружения влияют на работу программ и оболочки; одна из важнейших —
$PATH— определяет, где система ищет исполняемые файлы.- Команды можно запускать как по короткому имени, так и по полным путям.
- Чтобы разобраться в незнакомой команде, используйте справку:
--help— для короткой подсказки,man— для получения подробного руководства.