Основы командной строки
Зачем нужна командная строка?
Командная строка - это основной способ взаимодействия с операционными системами семейства UNIX. Все современные дистрибутивы для общего пользования включают и графическое окружение, которое позволяет обычному пользователю работать в оконном интерфейсе, без освоения командного интерпретатора. Но при необходимость выполнения служебных действий, практически всегда приходится обращаться к командной строке.
Команды позволяют выполнить практически любой действие с операционной системой. В отличие от Windows, в Linux чем более продвинутый пользователь, тем чаще ему приходится залезать в командную строку. Профессионалы работают с ней постоянно. Именно поэтому мы с вами будем изучать ее, чтобы работа в терминале не пугала нас, а наоборот, мы чувствовали себя там комфортно.
Команды значительно более гибкие и мощные, нежели графические оболочки. Графический интерфейс сильно ограничивает ваши возможности по взаимодействию с системой: вы можете выполнить только определенные действия и только в определенном порядке. Используя команды оболочки, можно выполнять любые действия, предусмотренные командной оболочкой, запускать любые программы и комбинировать их в любой последовательности
Сейчас мы будем употреблять термины “командная строка”, “оболочка”, “терминал”, “bash” и “командный интерпретатор” как синонимы. Между ними есть определенная разница, но в самом начале, чтобы не путаться, можно не обращать на нее внимания. Все эти термины относятся к способу взаимодействия пользователя с системой через ввод текстовых команд. Вообще, в Linux существует много разных командных интерпретаторов, построенных на основе разных языков программирования. Но с большим отрывом самый популярный - это bash. Именно про него мы и будем говорить дальше.
Командная строка работает по принципу REPL. То есть вы вводите команду, нажимаете <Enter>, в этот момент она исполняется, результат выводится на экран и вы можете вводить следующую. Однако, следует помнить, что некоторые команды являются интерактивными, то есть они выполняются, пока пользователь их явно не прервет.
Недостаток командной строки - отсутствие интуитивного интерфейса. Для совершения определенного действия необходимо знать команду, которая это действие совершает. В графическом интерфейсе можно сориентироваться, даже если вы не знаете точно что нужно делать, вы можете догадаться по названиям пунктов меню, пиктограмм, расположению на экране. В командной строке не так, только вы и черный экран. Поэтому сначала надо изучить хотя бы основные команды, а уже потом начинать работать. Сразу скажем, что работа в командной строке поначалу может показаться непривычной и даже неудобной. Это нормально, ощущение дискомфорта уйдет в процессе привыкания. На самом деле совершать определенные действия в командной строке гораздо удобнее, чем тыкать в кнопочки. Недаром большинство профессиональных администраторов, программистов и ученых предпочитают работать текстом, даже если есть графический инструмент для нужного действия.
Самое главное достоинство командной строки - удобство автоматизации. Командная строка - это еще и язык программирования. Если вы часто совершаете однотипные действия в командной строке вы можете просто записать их в скрипт и выполнять его. Ведь каждая команда - это по сути дела строчка в программе. В скриптах вы можете делать еще кучу всего - использовать условия, циклы, функции. Вы можете обращаться к командной строке из своих программ, на любом языке программирования. То есть при помощи командной строки вы можете производить комплексную автоматизацию. А вот автоматизировать действия в графическом интерфейсе наоборот, невероятно сложно.
Выводы:
- Для Linux командная строка - основной способ взаимодействия с пользователем.
- Самый распространенный интерпретатор командной строки в Linux - bash.
- Командная строка пугает, это нормально.
- Самое главное достоинство командной строки - удобство автоматизации.
Как туда попасть?
Изначально, терминал - это интерфейс ввода/вывода, состоящий из физических устройства ввода (клавиатура) и вывода (дисплей). Терминал предназначен исключительно для ввода информации и ее отображения на экране. Терминалы бывают физическими (реальными), виртуальными и псевдотерминалами (т.е. программами, которые “притворяются” терминалами). Не останавливаясь на подробностях работы реальных терминалов отметим, что при работе чаще всего вы будете использовать виртуальные терминалы и эмуляторы.
В системах Linux еще существуют несколько виртуальных терминалов. По умолчанию Линукс представляет доступ к шести текстовым терминалам, которые соответственно называются tty1, tty2 и т.д. Переключение между ними осуществляется сочетанием клавиш Ctrl+F1, Ctrl+F2, Ctrl+F3 и т.д. В современных дистрибутивах в одном из терминалов (обычно под номером 7) загружена графическая оболочка и этот терминал открывается по умолчанию. При загруженной графической оболочке открытие терминалов и переключение между ними производится клавишами Alt+Ctrl+Fn, (где n - номер терминала). Сама графическая оболочка будет доступна по Alt+Ctrl+F7. Для работы в каждом новом терминале вы должны прежде всего авторизоваться. Таким образом, в системе одновременно могут работать несколько различных пользователей, каждый в своем терминальном сеансе.
Если вы используете десктопный дистрибутив, то в одном из виртуальных терминалов запускается графическая оболочка. Именно он обычно и запускается по умолчанию. Поэтому при старте системы вы видите графический интерфейс. Но, кстати, для самой операционки, это просто такая специальная программа, запускаемая автоматически при загрузке в седьмом (обычно) виртуальном терминале
Самый простой способ - открыть программу-эмулятор терминала. В любой графической системе есть такая программа, которая открывает командную строку прямо в окне. Это удобно, так как не надо переключаться в другой терминал и логиниться там. Вы уже работаете в сеансе пользователя. Кроме того, такие программы-эмуляторы обычно содержат дополнительные функции, например, подсветку синтаксиса, масштабирование, прозрачность, вкладки.
Выводы:
- Терминал в старой терминологии - конечное устройство ввода-вывода пользователя.
- При запуске Linux создает несколько виртуальных терминалов.
- Для того, чтобы начать работать с терминалом, нужно, залогиниться.
- Существуют графические программы-эмуляторы терминала.
- За разными терминалами могут работать разные пользователи. А может и один.
Что вы видите на экране командной оболочки?
Когда вы открываете терминал, необходимо найти текущее положение курсора. Он обычно обозначается мигающей вертикальной чертой или знаком подчеркивания. Курсор обозначает то место, где будут появляться символы при их вводе с клавиатуры.
Все, что отображается в строке непосредственно перед курсором еще до того, как вы начали что-то вводить - это приглашение командной строки. Это строка определенного вида, которая отображается каждый раз перед вводом команды. Даже само ее название означает, что она приглашает вас ввести какую-нибудь команду. Если вы привыкли к виду приглашения командной строки, оно поможет вам ориентироваться в терминале. Кроме того, приглашение содержит некоторую полезную информацию.
Вид приглашения зависит от используемой оболочки и часто может настраиваться пользователем. Но мы пока рассмотрим стандартное приглашение оболочки по умолчанию. Оно обычно состоит из четырех частей.
Самым первым отображается имя текущего пользователя.
Далее после символа @ идет название текущего хоста (экземпляра операционной системы). Имя хоста обычно употреблаяется для обозначения текущего компьютера. Если вы работаете только за одним компьютером, вам может показаться, что это не очень полезное знание. Но в работе системного администратора часто возникает необходимость подключаться удаленно к разным хостам. И забыть, в консоли какого компьютера ты сейчас находишься - это не так странно, как может показаться.
Далее отображается имя текущей папки. Очень важный факт про консоль - в ней мы не можем находиться “просто так”, мы всегда находимся в какой-то папке на диске. Это имя “текущей директории”. Мы можем перемещаться между папками, или обращаться к файлам других папок, но в любой момент работы название текущей директории отображается в приглашении, чтобы мы всегда могли просто посмотреть, где мы сейчас.
Если вы только запустили терминал, то скорее всего находитесь в домашней папке. Она обозначается для краткости специальным символом ~. У каждого зарегистрированного пользователя есть своя домашняя папка.
Выводы:
- Курсор в терминале - это то, куда вводить буквы с клавиатуры.
- Приглашение командной строки - это полезная информация о вашем состоянии.
- В приглашении по умолчанию отображается имя пользователя, имя хоста и текущая папка.
- В терминале можно перемещаться по папкам.
- Вид терминала и приглашения можно настраивать.
Какие команды изучить в первую очередь?
Для работы в консоли необходимо знать команды. Интуитивным интерфейсом здесь не обойдешься. Изучение команд - это вопрос времени и практики. Чем больше вы работаете в системе, тем лучше ее знаете. Поэтому настоятельно рекомендуется как можно чаще пользоваться командной строкой в процессе изучения системы. Так вы сможете выработать привычку и освоить базовые команды не путем заучивания, а естественно.
90% вашего времени вы будете использовать самые базовые команды - переходы по папкам, создание и перемещение файлов и аналогичные. В этом разделе мы перечислим десять самых базовых команд, с которых удобнее всего начинать изучение командной строки и языка bash:
- pwd (print working directory) - отобразить текущую директорию.
- ls [<dirname>] (list) - вывести список файлов и папок в текущей директории. В linux директории считаются наряду с обычными файлами. ls Desktop - вывести список файлов в другой директории.
- cd [<dirname>] (change directory) - изменить текущую директорию. Для удобства, чтобы не указывать у файлов и папок постоянно путь к ним из текущей директории, можно изменить текущую директорию на ту, с которой вы работаете сейчас.
- cat <filename> (concatenate) - вывести на консоль (в стандартный вывод) содержимое текстового файла, имя которого передано как параметр. Можно передать несколько файлов, тогда они “склеятся”
- mkdir <dirname> (make a directory) - создание директории (папки). Параметром передается имя новой папки. Папка создается в текущей директории. Если здесь уже есть файл или папка с таким именем, то команда завершится с ошибкой.
- touch <filename> - вообще данная команда обновляет дату и время последнего доступа к переданному файлу. Если такого файла нет, то файл будет создан. Чаще всего эта команда используется для создания новых пустых файлов.
- _rm <filename> _(remove) - удаление файла. При помощи опций данная команда может удалять и директории. Обратите внимание, что удаление происходи насовсем. Никакая корхина в командной строке не предусмотрена. Поэтому этой командой надо пользоваться осторожно.
- cp <src> <dest> (copy) - копирование файла. Данной команде надо передать два параметра - имя копируемого файла и имя файла (возможно в другой папке), куда его необходимо скопировать. Очень часто в подобных случаях действует правило откуда - куда (сначала указывается имя исходного файла или папки, а потом - целевой папки или файла).
- mv <src> <dest> (move) - то же самое, только происходит не копирование, а перемещение файла. Если производить перемещение в ту же папку, где файл и был, он запишется с другим именем. Часто эта команда используется именно для переименования файлов.
- man <command> (manual) - получение справки по команде. Это, наверное, самая полезная команда, ей нужно пользоваться как можно чаще. Встроенная справка (мануал) - это самый главный, полный и актуальный источник информации о командах и их параметрах.
Как выполняются команды?
Каждая команда при своем выполнении (в тот момент, когда мы нажимаем Enter после самой команды) запускает определенный алгоритм, чаще всего - целую отдельную программу. Некоторые команды завершаются моментально (pwd), а другие (ping) - выполняются продолжительное время. Кроме того, некоторые команды запускают интерактивные программы (top). При работе с терминалом важно понимать, сколько будет выполняться та или иная команда.
Командная строка работает по принципу REPL (read - execute - print - loop), то есть после ввода команда тут же начинает выполняться, причем все, что эта команда выводит на печать отображается в том же терминале, в котором эта команда была введена. Поэтому для того, чтобы разные команды не смешивались, пока одна команда выполняется, она полностью блокирует собой этот терминал. То есть вы не сможете вводить другие команды, пока первая не завершится. После завершения команда освобождает занятый терминал, в нем автоматически снова выводится приглашение командной строки и цикл завершается, вы можете вводить следующую.
Большинство простых команд, таких как копирование файлов, создание директорий и другие, созданные для совершения одного определенного действия выполняются практически моментально. Большинство из этих команд - это стандартные служебные программы из проекта GNU, которые адаптировал существовавшее в UNIX рабочее окружение. Именно поэтому стандартные команды общие для всех дистрибутивов Linux, да и в других UNIX-подобных операционных системах они более-менее такие же.
Для таких простых стандартных команд часто действует определенная философия - команда должна принимать входную информацию либо через параметры, либо читать из переданного файла, и выводить информацию в консоль только чтобы сообщить об ошибке. Таким образом, чаще всего данные команды завершаются мгновенно и не выводят ничего. И именно такое поведение свидетельствует о том, что необходимые действия совершены успешно. Но новички часто думают, что если команда ничего не вывела, то она по каким-то причинам не отработала. В UNIX зачастую это не так.
Конечно, существуют команды, цель которых отобразить информацию в терминале. Типичный пример - команда ls. Она выводит список файлов в каталоге. Естественно, она должна выводить его на свой стандартный вывод. Еще, существуют команды, которые работают долгое время и выводят много информации в терминал. Например, так устроена команда find - поиск файлов по имени, команда ping вообще будет работать неопределенно долго, пока пользователь сам явне не прервет ее.
Но в любом случае, такие неинтерактивные команды стараются как можно реже запрашивать информацию у пользователя через стандартный ввод. Это сделано специально для того, чтобы команды можно было объединять в конвейеры или скрипты, то есть программы. Строить программу их интерактивных блоков довольно сложно, а из простых “кирпичиков” - очень легко. И зачастую администраторам приходится писать такие служебные скрипты, что гораздо удобнее, чем каждый раз вводить несколько команд руками.
Отдельно надо сказать о так называемых интерактивных командах. Их очень немного, но они работают в совершенно особом режиме. После запуска они полностью занимают терминал, обычно еще и полностью очищают окно. Зачастую у них присутствует псевдографический интерфейс. И в процессе своей работы пользователь может взаимодействовать с ними при помощи их собственных сочетаний клавиш, каких-то внутренних команд до тех пор, пока не выйдет из этой программы и не вернется в привычный терминал. Примерами таких интерактивных команд может служить текстовый редактор nano или программа мониторинга системы top.
Выводы:
- Команды выполняются по принципу REPL (как в IPython, например).
- В процессе выполнения команды, все что она выведет будет отображаться в терминале.
- После завершения команды вы опять увидите приглашение. Можно вводить следующую.
- Пока выполнение команды не закончено, терминал является заблокированным.
- Существуют интерактивные и неинтерактивные команды.
- Большинство команд терминала - это стандартные программы из проекта GNU.
- Если команда ничего не вывела и завершилась - значит все прошло успешно.
Какие приемы работы с командной строкой существуют?
Для успешной и быстрой работы в командной строке существует большое количество сочетаний клавиш. Ознакомьтесь с ними на практике и попробуйте запомнить наиболее полезные:
<Ctrl>+<C> - завершение текущей команды; эта комбинация клавиш используется если вам нужно аварийно прервать выполняющуюся в терминале команду.
<Ctrl>+<D> - выход из текущего сеанса (разлогин);
<Tab> - подсказки и множественное дополнение; при вводе команды, имени файла не обязательно вводить с клавиатуры название целиком. Можно ввести первые несколько символов и нажать символ табуляции. Если есть только одна команда или один файл с таким именем, оно заполнится автоматически. Если же таких несколько, то при повторном нажатии табуляции вам будет предложены все возможные варианты и вы сможете продолжить ввод с клавиатуры.
clear, <Ctrl> + <L> - очистка экрана (перемотка вперед); можно использовать команду или сочетание клавиш, они работают совершенно идентично.
<↑> - переход к предыдущей команде. Вообще с помощью стрелок вверх и вниз можно перемещаться по истории ранее введенных команд. Это очень экономит время, если вы повторяете команды или изменяете уже введенные.
<Ctrl> + <A> - переход к началу команды; аналогично клавише <Home>.
<Ctrl> + <E> - переход к концу команды; аналогично клавише <End>.
<Alt> + <F>, <Alt> + <B> - переход к следующему и предыдущему слову в команде;
history - вывод истории команд в текущем сеансе;
sudo apt update ; apt upgrade - выполнение нескольких команд из одной строки;
<Ctrl> + <R> - поиск команды в истории; это бывает полезно, если вы уже вводили похожую команду, но не можете ее найти с помощью стрелок.
Это только самые основные комбинации, работающие в любом терминале Linux. Кроме этого разные оболочки могут вводить собственные сочетания клавиш, сокращения команд и другие фишки для экономии времени. Использование этих возможностей совершенно необязательно, но делает работу в командной строке гораздо быстрее и удобнее.
Какова структура команды?
Любая команда оболочки состоит из одной или нескольких частей. Они разделяются пробелами. Основная часть, которая всегда идет первой при вводе команды - ее имя. Имя команды - обязательная часть. Нельзя выполнить команду не зная ее имени. Имя команды- чаще всего это название файла с исполняемым кодом этой команды. Например, ls - это имя команды. Точно так же имена других команд - cp. ps. top. firefox, многие другие.
Некоторые команды вполне обходятся только именем. Уже известная нам команда pwd - это команда, состоящая только из имени. Но у большинства команд кроме имени предусмотрены еще и другие элементы. Ключи или опции - это строки, которые могут быть указаны или отсутствовать и этим каким-то образом модифицировать порядок работы команды. У каждой команды свои опции, но в мире linux есть соглашения о стандартных опциях и их значениях.
Опции, они же ключи, - это необязательные строки, наличие или отсутствие которых при вызове команды как-то модифицирует ее поведение. Возьмем для примера команду ls. Будучи выполненной без опций она выводит список имен файлов, содержащихся в директории. Но у этой команды есть опция -l. Ее можно указать при вызове команды так: ls -l. То есть опции идут после имени команды через пробел. В таком виде эта команда также выведет список файлов в папке, но уже в табличном виде и с некоторой дополнительной информацией. Еще у команды ls есть опция -a - она заставит команду включить в список скрытые файлы, которые по умолчанию не отображаются.
Можно заметить, что опции состоят из одной буквы после дефиса. Это так называемый короткий формат опций. Есть еще и длинный. Например, опция -a полностью выглядит как –all. Короткие опции начинаются с одного дефиса и состоят из одной буквы. А длинные - начинаются с двух дефисов и состоят из одного или нескольких слов. Можно написать коротко, а можно и длинно, это одна и та же опция. Естественно, длинными опциями пользуются редко. Но иногда у команды может быть длинная опция, а короткого варианта нет, или наоборот.
Аргументы есть не у всех команд, указываются обычно после имени и опций. С помощью аргументов можно передать команде какую-то информацию на вход. Примерно так же, как мы передаем аргументы в функцию. Например, у той же команды ls есть необязательный аргумент - имя папки. Без аргументов эта команда отображает содержимое текущей папки, но можно заставить ее отобразить содержимое любой папки указав имя этой папки в качестве аргумента. Например, при вводе команды ls / будет отображены элементы, находящиеся в корневой папке, независимо от того, где мы сейчас находимся.
Аргументы бывают обязательные и необязательные в предыдущем примере аргумент можно и не указывать. А вот у команды cp есть целых два обязательных аргумента. Без них команда вообще не будет работать. Первый аргумент - это имя копируемого файла, а второй - имя папки, куда мы его копируем. Кроме этого у команды cp есть еще и опции.
Вообще, у каждой команды свой набор аргументов и опций и правил, в каком порядке нужно их указывать. Это называется синтаксис команды. Синтаксис команды задает разработчик команды при ее создании. Все, что мы описывали ранее - это не более чем набор общепринятых правил, традиционных для стандартных команд Linux. Но помните, что разработчики команд могут и проигнорировать эти правила. Например, в командах операционной системы BSD принято опции делать без дефиса. Поэтому у команды ps опции указываются именно так (ps a, ps aux). Самый лучший способ узнать синтаксис команды - прочитать официальную справку по ней.
Выводы:
- У любой команды есть имя - название программы - его вводить обязательно.
- У команды могут быть обязательные или необязательные аргументы и необязательные опции.
- Опции (ключи) могут модифицировать выполнение программы.
- Опции бывают длинные и короткие. Короткие начинаются с одного дефиса, длинные - с двух.
- Опции команды можно комбинировать, а короткие опции можно объединять.
- Аргументы команды - это как аргументы функции - служат для указания входных данных.
- Синтаксис команды зависит от ее разработчика и про него можно почитать в справке.
Где получить помощь?
При работе с командной строкой приходится постоянно обращаться к документации. Невозможно постоянно держать в голове все команды, нюансы их использования, синтаксис. Поэтому в саму командную строку встроена официальная документация по системным командам. Эта официальная документация называется мануалы, man. Эти мануалы пишут разработчики команд и держат в актуальном виде.
Для доступа к официальным мануалам существует команда man. Есть еще несколько информационных команд (например, info), которые могут различаться от дистрибутива к дистрибутиву. Но man до сих пор остается основным источником информации про синтаксис команд. Посмотреть справку по команде, например, pwd, можно так:
1
$ man pwd
Мы получим полную и актуальную справку (мануал) по команде pwd, включая все возможные ее ключи и опции. Команда man может показать мануал по любой команде bash.
Рекомендуется пользоваться именно этой документацией потому, что синтаксис команд может меняться. В разных дистрибутивах, например, могут быть немного различающиеся наборы стандартных команд. Также синтаксис меняется от версии к версии, с изменением и доработкой самих команд и их окружения. Поэтому именно мануалы покажут вам справку именно по вашей команде именно нужной версии.
Конечно, для того, чтобы почитать мануалы, нужно знать само имя команды. К счастью, мануалы - не единственный источник информации. По всем распространенным командам достаточно легко получить справку и примеры использования в интернете. Существует большое количество тематических справочников, форумов, сообществ пользователей и разработчиков. И чем популярнее дистрибутив вы используете, тем больше про него будет информации. Учебники, справочную литературу тоже не стоит сбрасывать со счетов.
Выводы:
- Для всех стандартных команд существует официальная справка.
- Команды и их синтаксис могут меняться в разных дистрибутивах и версиях.
- Первый источник информации - команда man.
- Также информацию можно получить в интернете, на форумах, в учебниках.