
Командная строка Linux: как запускать команды и находить справку
Разбираем устройство команды Linux, кавычки, переменные, историю, справку man и безопасное использование sudo.
Содержание
Командная строка удобна тем, что каждое действие можно увидеть, повторить и проверить. Но одна лишняя кавычка или неверный путь меняют смысл команды. Поэтому важнее понимать, как Linux разбирает строку, чем запоминать длинный список примеров.
Терминал и командная оболочка
Терминал — это окно или удалённый сеанс, где видны ввод и вывод. Внутри работает командная оболочка, по-английски shell. Она разбирает введённую строку на команду и аргументы, подставляет переменные, обрабатывает кавычки и только после этого запускает программу. В примерах используется Bash — стандартная оболочка многих серверных дистрибутивов.
Обе команды ниже выполняются в текущем терминале и ничего не меняют. Первая показывает оболочку, назначенную вашей учётной записи, вторая — программу, которая фактически обрабатывает этот сеанс:
printf '%s\n' "$SHELL"
ps -p $$ -o comm=
printf получает формат %s\n: напечатать строку (%s) и перевод строки (\n). Переменная $SHELL обычно содержит путь вроде /bin/bash. В выражении $$ Bash подставляет PID — числовой идентификатор текущей оболочки. Команда ps -p выбирает процесс по этому PID, а -o comm= оставляет только имя команды без заголовка столбца.
Например, первая строка может вывести /bin/bash, а вторая — bash. Значения способны различаться, если поверх оболочки учётной записи вручную запущена другая. Ошибка ps: process ID list syntax error означает, что текущая оболочка иначе обрабатывает $$ или значение не было подставлено.
Следующий пример только читает каталог /var/www. Выполняйте его на учебной машине; отсутствие каталога безопасно и даст понятную ошибку. В строке ls — имя программы, -la — две объединённые опции, /var/www — отдельный аргумент-путь:
ls -la /var/www
Ключ -l включает подробный список с правами, владельцем, размером и временем, -a добавляет скрытые имена, включая . и ... Успешный вывод начинается строкой total и далее содержит записи каталога. Сообщение No such file or directory говорит только об отсутствии этого учебного пути; замените его существующим, а не создавайте системный каталог ради примера.
Пробел разделяет аргументы ещё до запуска ls. Поэтому путь с пробелом нужно передать как одно значение в двойных кавычках. Этот пример также ничего не изменяет:
ls -ld -- "/srv/project files"
Здесь -d просит показать запись самого каталога, а не перечислять его содержимое. Маркер -- завершает опции: всё после него трактуется как путь, даже если имя начинается с дефиса. При существующем каталоге будет выведена одна строка; при его отсутствии ls завершится сообщением об ошибке, не создавая и не удаляя ничего.
Откуда берётся команда
Одинаковое имя может обозначать встроенную возможность Bash, псевдоним — короткую замену другой строки, пользовательскую функцию или отдельную программу. Выполните диагностику в Bash; она не запускает исследуемые команды:
type cd
type ls
type -a python
command -V nginx
type cd обычно сообщает, что cd — встроенная команда: сменить рабочий каталог дочерним процессом нельзя, поэтому это делает сама оболочка. type ls может показать внешний файл или псевдоним. Ключ -a перечисляет все найденные варианты python, а не только первый. command -V даёт текстовое описание имени nginx; ненулевой код и сообщение not found означают, что имя сейчас недоступно.
Внешние программы оболочка ищет в каталогах из переменной PATH. Чтобы увидеть их порядок, напечатайте PATH, затем попросите Bash найти исполняемый файл. Оба действия безопасны:
printf '%s\n' "$PATH"
command -v nginx
PATH содержит разделённые двоеточиями каталоги, которые проверяются слева направо. command -v nginx при успехе напечатает найденный путь, например /usr/sbin/nginx; пустой вывод и ненулевой код означают, что команда не найдена в текущем окружении. Проверить код можно сразу через echo $?, где 0 — успех.
Не добавляйте текущий каталог . в начало PATH на сервере: случайный файл с известным именем сможет подменить команду. Для собственного файла используйте явный путь ./script.sh.
Где читать справку по команде
Уровни справки дополняют друг друга. В блоке ниже command_name — не настоящая команда, а место для имени, которое вы исследуете, например cp; кавычки вокруг поисковой фразы оставляют её одним аргументом:
type command_name
command_name --help
man command_name
apropos "search phrase"
type сначала уточняет природу имени. --help обычно даёт краткий синтаксис конкретной программы. man открывает полное локальное руководство, а apropos ищет фразу в описаниях man-страниц. Если command_name скопировать буквально, ожидаема ошибка — сначала замените его.
Для встроенных команд Bash используйте help cd или help type, потому что отдельной внешней программы для них нет. В man нажмите /, введите слово и подтвердите Enter; n переходит к следующему совпадению, q закрывает просмотр. Номер раздела устраняет неоднозначность: man 5 passwd описывает формат файла, а man 1 passwd — пользовательскую команду.
Не копируйте опцию из случайного примера, не проверив локальную справку. Утилиты и дистрибутивы могут различаться, а короткий ключ иногда имеет другое значение.
Зачем нужны кавычки и переменные
Одинарные кавычки сохраняют текст буквально. Двойные позволяют подстановку переменной, но удерживают результат одним аргументом. Этот учебный блок только создаёт переменную в текущей shell и печатает две строки:
wvPath="/srv/project files"
printf '%s\n' "$wvPath"
printf '%s\n' '$wvPath'
В первой строке пробелы вокруг = намеренно отсутствуют: это присваивание, а не запуск команды. Вторая строка раскрывает $wvPath и выводит /srv/project files. Третья должна напечатать буквальный текст $wvPath, потому что одинарные кавычки отключают подстановку.
Без кавычек значение $wvPath превратилось бы в несколько аргументов. Особенно опасно это в командах копирования и удаления. Используйте осмысленные имена переменных и сначала печатайте вычисленный путь.
Подстановка $(...) выполняет вложенную команду. Не вставляйте в неё непроверенный ввод и не используйте для построения рискованных команд. Если действие можно записать прямыми аргументами, его легче проверить.
Шаблоны *, ? и квадратные скобки раскрывает shell до запуска программы. Следующая команда только печатает аргументы, в которые shell раскрыл имена с окончанием .log в /var/log:
printf '%s\n' /var/log/*.log
Если совпадения есть, каждый путь появится на отдельной строке. Если их нет, Bash по умолчанию передаст буквальный текст /var/log/*.log; другие оболочки или настройки могут завершить команду ошибкой либо удалить несовпавший шаблон. Поэтому сценарий не должен угадывать результат шаблона. Перед изменяющей командой сначала покажите найденный набор через printf или find.
Куда попадают вывод и ошибки
Стандартный вывод и поток ошибок — разные каналы. Блок ниже — схема, а не готовая команда: замените command_name реальным безопасным вызовом и выполняйте в каталоге, где можно создать два файла:
command_name >result.txt 2>error.txt
У каждого потока есть номер, который называют файловым дескриптором. Номер 1 — обычный вывод; перед первым > он опущен. Номер 2 — сообщения об ошибках. Оператор > создаёт или полностью перезаписывает файл, а >> дописывает. Успех проверяют кодом команды и содержимым обоих файлов; пустой error.txt сам по себе не гарантирует код 0.
До выполнения проверьте целевой путь. В строке sudo command > /root/file перенаправление настраивает текущий shell до запуска sudo, поэтому повышение прав относится к программе, но не к открытию файла оболочкой.
Конвейер передаёт стандартный вывод одной программы на стандартный ввод другой. Этот пример только показывает процессы и открывает результат в постраничном просмотрщике:
ps -eo pid,user,comm | less
У ps ключ -e выбирает все процессы, -o задаёт столбцы pid, user и comm. Символ | передаёт строки программе less; в ней Space листает страницу, / ищет, q завершает просмотр. Наличие таблицы с заголовками PID USER COMMAND подтверждает работу первой команды.
Код всего конвейера в Bash по умолчанию берётся у последней команды, поэтому успех less не всегда означает успех ps. Для сценариев Bash существует режим set -o pipefail: с ним конвейер сообщает об ошибке любой своей команды, а не только последней. В интерактивной работе прежде всего читайте сообщения об ошибках.
Как повторить команду из истории
Историю следует сначала показать, а не немедленно выполнять. Эта команда печатает до двадцати последних записей текущей оболочки:
history 20
Число слева в выводе — номер записи, далее идёт сохранённая строка. Поиск Ctrl+R возвращает совпавшую команду в редактор. Не нажимайте Enter сразу: проверьте сервер, каталог, дату и аргументы. Старая команда могла быть безопасной в другом контексте. Если история отключена политикой shell, пустой результат не следует «чинить» до понимания этой политики.
Пароли, приватные ключи и токены нельзя передавать в командной строке. Настройка истории не является полноценной защитой: значение может увидеть список процессов, лог CI или терминальный журнал. Используйте предназначенный программой файл конфигурации, стандартный ввод или менеджер секретов с ограниченными правами.
Когда команде нужен sudo
Сначала попробуйте чтение без sudo. Этот блок проверяет Nginx, но ничего не перезапускает и не меняет; имя службы замените, если исследуете другой процесс:
systemctl status nginx --no-pager
journalctl -u nginx -n 30 --no-pager
systemctl status показывает активность службы, последние сообщения и код завершения; --no-pager выводит текст без less. У journalctl ключ -u nginx выбирает одну службу, -n 30 ограничивает вывод тридцатью последними строками. Признак нормальной работающей службы — Active: active (running), но для oneshot-службы ожидаемое состояние может быть иным.
Если вывод журнала скрыт или прав не хватает, добавьте sudo к одной понятной команде чтения. Постоянная оболочка пользователя root увеличивает последствия опечатки: все следующие команды получают полные права.
Перед изменением файла сохраните проверяемую копию в закрытом каталоге или используйте Git. У программ, которые читают конфигурацию, обычно есть отдельная команда проверки; выполняйте её до применения нового файла.
Что проверить перед незнакомой командой
- Сформулируйте ожидаемый результат.
- Выполните
typeилиcommand -V. - Прочитайте
--help,helpлибоman. - Проверьте аргументы и абсолютные пути.
- Начните с команды чтения или тестового каталога.
- Для изменения подготовьте откат.
- Выполните действие с минимальными правами.
- Отдельной командой проверьте состояние.
Например, перед копированием конфигурации сначала проверьте каталог назначения и сам источник. Команды ниже только читают метаданные и намеренно не выполняют копирование:
ls -ld -- /etc/nginx /srv/config/nginx.conf
stat -- /srv/config/nginx.conf
ls -ld должен показать две отдельные записи: каталог /etc/nginx и файл источника. stat добавляет размер, владельца, права, inode и временные метки файла. Ошибка хотя бы по одному пути означает, что копирование начинать нельзя: сначала исправьте путь или создайте предусмотренный процессом источник.
Не объединяйте копирование, проверку конфигурации, перезапуск и удаление резервной копии в одну строку: при ошибке будет непонятно, какой шаг изменил систему.
Небольшое упражнение
В тестовом каталоге создайте файл с пробелом в имени, найдите его через ls, прочитайте справку stat, сохраните вывод в другой файл и объясните разницу между одинарными и двойными кавычками. Затем определите тип команд cd, printf и nginx.
Перед изменением файлов разберитесь с каталогами, владельцами и правами. На новом VPS сначала выполните первичный осмотр системы, а привилегированные команды ограничьте правилами пользователей и sudo.
Первоисточники
- GNU Bash Reference Manual — синтаксис shell, встроенные команды, история и раскрытия.
- GNU Coreutils Manual — справочник основных файловых и текстовых утилит.
Самопроверка
Проверьте, что материал усвоен
Ответьте на все вопросы. Результат сохранится только в этом браузере и будет учтён в статистике прочитанных материалов.
Разбираем коротко
Частые вопросы
Чем shell отличается от терминала?
Терминал предоставляет окно или сеанс ввода, а shell интерпретирует введённые команды. В одном терминале можно запустить Bash, Zsh или другую оболочку с отличающимися возможностями.
Как узнать, является ли команда встроенной в Bash?
Выполните type имя_команды. Bash сообщит, является ли имя встроенной командой, внешней программой, псевдонимом или функцией, а command -V даст похожее описание.
Безопасно ли хранить административные команды в истории?
История удобна для аудита собственных действий, но в командной строке нельзя передавать пароли и токены: они могут попасть не только в историю, но и в список процессов или журнал автоматизации.


