Приветствую, авантюрист. Ну что ж, пришло время для того, чего бояться и от чего просыпаются в холодном поту все Windows-пользователи. Именно ЕГО приводят в пример, когда говорят о сложности Linux-систем, и даже не подозревая, что он есть в любой системе (только в Windows он настолько убог, что пришлось придумать PowerShell. Шутка). Именно этим словом пугают айтишников-первокурсников. И именно им выпендриваются школьники. Сегодня я расскажу тебе о его величестве терминале. Постараюсь изложить всё кратко и по делу.
Необходимые знания
Уровень сложности материала — легкий. Необходимо понимание принципов работы файловой системы. Понимание расположения данных в файловых системах семейства Linux.
А надо ли?
В качестве небольшой преамбулы немного философии. Очень часто читаю в сети абсолютно противоположные отзывы о терминале. Кто-то с слюнями из носа утверждает, что в Linux-системе без знания терминала ты и шага не сделаешь, кто-то с пеной у рта доказывает, что терминал там вообще не нужен и всё можно делать через GUI ( графический интерфейс ) . Правда, как обычно, где-то посередине.
Да, в большинстве современных дистрибутивов действительно можно пользоваться компьютером на базовом уровне, вообще не прибегая к терминалу. Это так. Если тебе достаточно простого сценария, такого как запускать браузер, «Телеграмм» и работать в офисных приложениях, то никакого терминала не нужно. И даже в более серьезных сценариях люди прибегают к помощи специалиста для настройки ПК и потом просто используют его, никогда не запуская терминала. Так, например, часто делают и Windows-пользователи. Вызывают специалиста, он всё настраивает, после чего пользователь просто использует ПК.
Но если ты хочешь расти как специалист/пользователь, без знания терминала не обойтись. Понимание терминала значительно облегчит опыт использования ПК. Многие задачи делать проще именно через него. Ты сможешь лучше разбираться в мануалах, статьях и, следовательно, более качественно понимать и использовать свой ПК, решать какие-то мелкие и не только проблемы без помощи специалиста.
Что такое терминал
Терминал — это программа, с помощью которой пользователь взаимодействует с операционной системой через интерфейс командной строки. То есть это некий инструмент взаимодействия с системой в текстовом режиме. Через терминал ты можешь запускать любые другие программы, работать с файловыми системами, следовательно, работать с файлами, каталогами и любыми другими объектами. Можешь управлять настройками системы, конфигурациями программ и т. д. В общем, делать абсолютно всё то, что можно делать через графический интерфейс, и больше. Например, можно автоматизировать какие-либо процессы или задачи, создавая скрипты для терминала. Создавать задачи, которые будут выполняться в указанное время. Легко запускать фоновые процессы. Получить гораздо больше возможностей по управлению системой и системными объектами. Ну и многое другое.
Раньше терминалом было физическое устройство с клавиатурой и монитором, сейчас же эту функцию выполняют программы, такие как Konsole в KDE или Gnome Terminal в GNOME. Есть, конечно, и другие, менее распространенные программы-терминалы. По-хорошему, их называют эмуляторы терминала, но сегодня все просто говорят «терминал» или «консоль». Для того чтобы запустить терминал, нам нужно запустить одну из этих программ. Вот так, к примеру, выглядит Konsole в KDE.
Внешний вид может отличаться, но есть обязательные элементы. Есть рабочая область (черный фон) и строка приветствия или строка приглашения.
В строке приветствия указан пользователь, от имени которого ты сейчас работаешь (zerg), через знак-разделитель (@) указано имя компьютера (spinegrant) и затем каталог, где ты сейчас находишься (home). Последний символ ($) означает, что текущий пользователь (zerg) не является суперадминистратором. Или еще иногда говорят, не привилегированный пользователь. У суперадминистратора будет знак решетки (#).
Ввод вывод
В строку приветствия вводятся команды и их аргументы. Команда и аргументы — это поток ввода или входящий поток (stdin). Результат работы этих команд — вывод или выходящий поток (stdout, stderr). Вывод команды будет отображаться в рабочей области построчно сверху вниз слева направо (если другого не захочет разработчик команды).
Потоков вывода два. По умолчанию ты видишь в рабочей области оба. Один из них стандартный поток вывода (stdout), а второй поток вывода ошибок (stderr). При желании можно оставить только вывод ошибок или наоборот. Как использовать потоки вывода, решает разработчик команды, но в целом логика такова, что в поток stderr должны выводиться только ошибки.
Вот так, например, выглядит вывод команды ls.
Вывод одной команды можно направить на ввод другой ( даже самой себя ) или перенаправить в файл, что дает возможность создавать очень гибкие, мощные, при этом лаконичные конструкции. Но это уже более серьезные моменты, здесь об этом говорить не будем.
Команды и их аргументы
Для того чтобы выполнить команду, нужно набрать ее в строку приветствия и нажать Enter. Нажатие Enter дает сигнал терминалу, что набор команды закончен и нужно ее выполнять. К примеру, уже знакомая тебе команда ls. Набери ее в терминале и нажми Enter. Данная команда выводит содержимое текущего каталога. Посмотреть путь текущего каталога (каталог, где мы сейчас находимся) можно командой pwd.
Мы видим содержимое домашнего каталога текущего пользователя (/home/zerg).
Кстати, домашний каталог пользователя обозначается знаком «~» для сокращения.
Внешний вид, цветовые схемы вывода команды ls могут отличатся на разных эмуляторах терминала, но тут четко можно сказать, что синенькие — это каталоги, а всё остальное — файлы.
У команд есть параметры или ключи, или опции, или аргументы. Это всё то, что добавляется к команде через пробел. В различной литературе можно увидеть различное применение этих терминов. Но суть остается одинаковая: это все некие «настройки» для команды, меняющие ее поведение, и все они ( термины ) в общем случае обозначают одно и то же. Какой именно термин применять, зачастую дело вкуса.
В данном примере мы применили ключ -l, который изменил внешний вид вывода команды.
Также для команды можно указывать входящие данные. Разделение тут сугубо логическое, входящими данными, как правило, называют то, с чем команда непосредственно работает. Например, команда ls выводит текущий каталог, но можно указать, какой конкретно каталог я хочу посмотреть.
В данном примере /home будет входящими данными для команды ls, и мы увидим содержимое каталога /home, несмотря на то, что находимся в домашнем. Также нам ничего не мешает обеднять параметры или входящие данные, если это позволяет логика команды. К примеру, ls -l /home выведет содержимое каталога /home в виде списка.
Аргументы бывают длинные и короткие или сокращенные и полные (опять же в разной литературе можно встретить разное применение терминов). Короткие состоят из 1 символа, перед которым ставится тире, например -l или -D. Длинные состоят из одного или нескольких слов, перед которыми ставится два тире, например --list или --reinstall. Иногда тире не ставят, и это уже больше не как параметр, а как некий режим работы команды. Зачастую одно и то же действие имеет и сокращенный ключ и полный. Казалось бы, зачем дублировать одно и то же действие и длинным и коротким ключом? Всё очень просто, короткие используются непосредственно в работе, а длинные, например, в скриптах. Таким образом скрипты выглядят более читаемыми и понятными.
Пробелы в терминале или что это за кавычки?! Зачем они тут вообще?!
Важно понимать, что для терминала команда и аргументы разделяются пробелами. И если в самих аргументах необходимо использовать пробелы, то на вход это нужно подавать в кавычках или экранировать. Например, я хочу увидеть содержимое каталога /tmp/Новая папка. Если я напишу команду ls /tmp/Новая папка, то терминал это разобьет на 3 составляющие: «ls», «/tmp/Новая» и «папка» и по логике команды попытается вывести содержимое каталога «/tmp/Новая». Следовательно, тут я должен заключить путь каталога в кавычки, и тогда это будет воспринято как единый аргумент ls «/tmp/Новая папка». Или экранировать пробел, поставив перед ним символ «\». Команда будет выглядеть вот так: ls /tmp/Новая\ папка.
Внутри каталога создал файл easy_linux для наглядности.
Ушел «курить мануалы». Помощь по командам
Абсолютно у всех команд есть обязательный ключ --help. Его сокращенный дублер -h (есть не во всех командах). Как понятно из самого ключа, мы увидим некую «помощь» (help) или «инструкцию» или «мануал» (manual) по работе с командой. Давай посмотрим инструкцию уже знакомой нам команды ls.
Здесь можно увидеть довольно много полезной информации по использованию команды. Умение читать и понимать мануалы сильно поднимает тебя как специалиста над другими и облегчает жизнь. Ну и всегда помни, что интернета может не оказаться под рукой.
Говоря о мануалах, я просто не имею права не сказать про команду man. Данная команда принимает во входящих данных имя команды, информацию о которой нужно получить, и выдает более серьезную инструкцию по команде, зачастую с примерами. Вывод команды man ls занимает 238 строк. Для выхода используй клавишу q.
В мануале к команде можно увидеть синтаксис команды (строчка «Использование»). Полезно узнать порядок параметров. Например, я постоянно забываю, как правильно указать аргументы при создании ссылки. Команда ln. Мы сначала указываем объект, на который ссылаемся? А потом ссылку или наоборот?
Смотрим в строчку «Использование» и видим, что сначала цель, а потом уже ссылка, ну и вначале указываются параметры, если они есть.
Почаще заглядывай в мануалы.
Волшебный TAB
Есть на клавиатуре клавиша TAB. В данной статье я выделю ей отдельный раздел по причине того, что она превращает работу в терминале в некий танец. Дело в том, что данная клавиша заставит терминал дописать команду за вас. Если есть команда astra-install, вам достаточно набрать «as» и нажать два раза TAB. Эмулятор терминала допишет команду за вас до конца. Есть каталог /home/Новая папка. Достаточно набрать «ls /home/Н» и нажать клавишу TAB. Терминал допишет путь до конца! Ты забыл точное название пакета для установки? Не беда, достаточно набрать несколько букв из его названия, и терминал сам допишет его название и т. д. Огромное количество рутины просто исчезает с появлением этой клавиши.
Стоит понимать, что при совпадении начала команд или путей будет предложен выбор, какую именно вам надо дописать команду или путь. Например, есть каталоги /bin и /boot. Если я наберу ls /b и нажму TAB, то консоль, понимая, что есть два варианта для дописывания команды, выведет мне оба варианта и будет ожидать уточнения.
И если уточнить ls /bi, то тут уже будет дописан каталог bin.
Это очень сильный и важный инструмент упрощения работы в терминале. Обязательно попрактикуйся и пойми его логику работы.
Пользователи
Все действия в терминале выполняются от конкретного пользователя. Пользователей в Linux-системах можно классифицировать как root и все остальные. Пользователь root является суперпользователем, и у него наивысшие права в системе. Только суперпользователь может устанавливать и удалять программы, вносить изменения в настройки системы, управлять сервисами и службами и т. д. Подобный механизм помогает избежать довольно многих проблем, ведь обычный пользователь практически ничего не может сделать, а значит, и сломать. Но согласись, было бы ужасно неудобно каждый раз перезаходить в систему под рутом для того, чтобы что-то настроить или установить. Именно для устранения этого неудобства в любой операционной системе Linux существуют две важные команды: это sudo и su. Их задача — выполнять команды от имени другого пользователя (в основном от пользователя root). А это значит, можно выполнить любые привилегированные команды прямо из сеанса текущего пользователя. Основное отличие у данных команд в том, что sudo для выполнения команды запросит пароль ТЕКУЩЕГО пользователя, а su — пароль от пользователя root. К примеру, у любого пользователя есть свой домашний каталог. Суперпользователь root не исключение. Если попробовать посмотреть его содержимое, то у нас ничего не выйдет.
Но применив команду «su -» и введя пароль от рута, я как бы стал суперадминистратором и без проблем получил содержимое каталога.
В данной статье я не смогу рассказать и объяснить все премудрости команды su и sudo. Это довольно обширная тема с действительно большим количеством нюансов. Вполне достаточно знать, что такие команды есть и для чего они есть. А дальше найти больше информации о настройках и нюансах труда не составит. Также в разных дистрибутивах разные настройки по использованию этих утилит, и привести универсальные примеры не получится. В той же «Альт Линукс» из коробки sudo отключен. А в Ubuntu, наоборот, во всех мануалах всё делается исключительно через sudo.
Использование файловой системы
Навигация по файловой системе — минимальная база для качественного использования терминала. Перемещение, создание, удаление, копирование — всё это можно делать через терминал. И самое важное — это редактирование. На самом деле здесь всё просто. Достаточно запомнить несколько команд.
pwd — показать текущий каталог
ls — отобразить содержимое текущего каталога
cd «путь» — перейти в указанный каталог
cp «из» «в» — скопировать, если хотим рекурсивное копирование, то есть с вложенными каталогами, то используем ключик -R
mv «из» «в» — переместить
rm «путь» — удалить. Удалить можно только файл. Если хотим удалить каталог, то используем ключик -r. Также можно использовать ключик -f, чтобы команда не спрашивала подтверждение на каждый файл.
mkdir «путь» — создать каталог
touch «путь» — создать файл.
Вот, собственно, и всё: перемещаемся по каталогам, смотрим содержимое, ищем нужные файлы и каталоги, используем клавишу TAB, не забываем про пробелы в путях, и мы можем выполнять любые операции с файловой системой.
Стоит сказать про пару нюансов. В файловой системе, чтобы перейти на каталог вверх, используются две точки (..), чтобы указать текущий каталог, используется одна точка (.). Также есть множество различных алиасов и сокращений, к примеру, я уже говорили, что «~» используется для перехода в свой домашний каталог. Пример, я хочу перейти в свой каталог, потом подняться наверх на 1 уровень и посмотреть его содержимое. Я выполню следующий ряд команд.
Команды pwd вставил для наглядности.
Ну и самое-то важное — это то, что ты можешь редактировать текстовые файлы прямо в терминале. А если учитывать, что все конфигурации хранятся в тех самых текстовых файлах, мы можем делать всё что угодно, сломать всё что угодно и изменить всё как нам надо. Для редактирования файлов есть много разных консольных редакторов, я использую либо vi, либо nano. Говорят, что vi прям мегакрут, но для редактирования конфигов, а это, как правило, изменить true на false, более чем достаточно обоих. Изучение редакторов также оставлю на ДЗ. Очень советую первым делом научиться из них выходить, прежде чем пробовать использовать. Вот так выглядит, например, nano.
Это стоит знать
Буквально пару слов необходимо сказать о том, что для остановки запущенных команд применяется сочетание клавиш Ctrl + Z либо Ctrl + C. А также стоит сказать про копирование и вставку. Так как комбинации Ctrl + C и Ctrl + V уже заняты, необходимо использовать либо мышку и производить копирование/вставку через контекстное меню, либо использовать клавиши Shift + Ctrl + C и Shift + Ctrl + V соответственно.
Итог
Определенно, можно много чего еще написать, но лучше я при необходимости потом напишу еще материала, чем перегружу одну статью всем подряд. Я попытался передать именно базовую информацию для человека, который терминал открывал 1 раз в жизни и не имеет никаких знаний вообще, но после прочтения материала смог бы начать его использовать, ну или хотя бы понимать, куда двигаться дальше (в дурку). Надеюсь, буду хоть кому-то полезен.