Командная строка в операционной системе Linux “умеет” делать очень много полезного — того, что часто невозможно сделать при помощи других инструментов. Самый популярный вариант интерфейса командной строки называется bash.

Даниил Пилипенко, программный директор факультета backend-разработки направления «Программирование» Skillbox, директор центра подбора IT-специалистов SymbioWay ответил на самые популярные вопросы про командную строку bash и рассказал, как её освоить.

Что такое и зачем нужна bash

В операционных системах, устанавливаемых на обычные компьютеры, — Windows и macOS, — всегда есть командная строка bash, но обычными пользователями она используется редко или не используется совсем.

Другая ситуация, если вы разработчик. Например, frontend-разработчикам может понадобиться собирать свои приложения при помощи сборщика webpack, который удобно запускать из командной строки. Тем, кто настраивает на своём компьютере окружение для разрабатываемого программного обеспечения, может потребоваться настраивать Docker, что также удобнее всего делать именно из командной строки. Если вы работаете с системой контроля версий Git, то командная строка для Git — наиболее универсальный инструмент работы, позволяющий использовать функционал этой системы наиболее полно.

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

Таким образом, сама по себе командная строка –– это отдельная область знаний, которыми важно уметь пользоваться каждому разработчику и современному IT-специалисту. Требование знаний командной строки Linux есть в большинстве современных вакансий backend-разработчиков, DevOps-инженеров и инженеров по тестированию, поскольку в их работе она применяется достаточно часто и порой является чуть ли не основным инструментом повседневной работы.

Пример использования bash

Представьте, что вы работаете с сервером, и вам на нём нужно создать ещё один сайт, работающий на PHP, и настроить на этом сайте HTTPS, чтобы пользователи сайта, заходя на него, видели слева “замочек” и знали, что подключение к этому сайту защищено.

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

cd /var/www/html

Команда cd позволяет перемещаться между папками и заходить в ту папку, в которой вы хотите выполнить команду. Далее вы можете создать в этой папке папку вашего сайта (обычно папку принято называть по имени домена, на котором этот сайт потом будет находиться):

mkdir referral.symbioway.ru

Команда mkdir создаёт папку с указанным вами именем в текущей папке. Затем вы можете настроить сервер Nginx, чтобы он работал с этой папкой — сначала перейти в папку с файлами конфигурации сервера:

cd /etc/nginx/sites-available

Затем скопировать какой-нибудь уже существующий файл конфигурации и создать на его основе файл конфигурации для вашего домена:

cp test.symbioway.ru.conf referral.symbioway.ru.conf

И заменить в нём имя домена на новое:

sed -i "s/test.symbio/referral.symbio" referral.symbioway.ru.conf

Эта команда заменит в файле referral.symbioway.ru.conf все строки “test.symbio” на “referral.symbio”. Затем вам нужно создать ссылку на этот файл в папке sites-enabled сервера Nginx:

cd ../sites-enabled

ln -s ../sites-available/referral.symbioway.ru.conf .

После чего вам нужно перезапустить Nginx:

service nginx restart

Всё, сайт настроен! Если вы уже сделали запись в настройках DNS, в которой домен referral.symbioway.ru сопоставлен с IP-адресом вашего сервера, то, скорее всего, при входе по этому домену у вас уже открывается страница сервера. Чтобы убедиться, что на сервере работает PHP, вы можете перейти в папку сервера и создать в ней PHP-файл, который будет выводить, например, текущую дату. Для этого при помощи команды cd вы можете снова перейти в папку вашего сайта:

cd /var/www/referral.symbioway.ru

Создать файл index.php и записать в него строку, которая будет выводить текущую дату:

echo "<? echo date('r');" > index.php

После этого вы можете даже запустить этот файл, выполнив команду:

php index.php

И, если всё работает, результат будет примерно таким:

Tue, 09 Aug 2022 08:05:59 +0300

Но, поскольку вы хотите проверить работу сервера, вам следует зайти по ссылке https://referral.symbioway.ru/ и убедиться в том, что страница открывается. Затем мы с вами хотели настроить HTTPS. Если у вас на сервере уже установить certbot — программа для настройки HTTPS-сертификатов, добавить такой сертификат к своему домену не составит труда. Для этого нужно выполнить команду:

certbot --nginx -d referral.symbioway.ru

И после выполнения этой команды следовать инструкциям. По окончании настройки перезапустить Nginx:

service nginx restart

Ну и, конечно, зайти в браузер и проверить, всё ли работает верно :)

Аналогичным образом командная строка bash может быть использована в работе любого backend-разработчика. Например, если вы создаёте приложение на Java, то для его развертывания на сервере, оборачивания JAR-файла в сервис или просто запуска вам потребуется командная строка и понимание принципов её работы.

Какие есть сложности с использованием bash

Основная сложность, которая возникает у новичков –– это незнание основных команд и непонимание принципов работы командной строки.

Например, частая проблема у начинающих разработчиков — неверная настройка прав доступа к файлам и папкам. В операционной системе Linux, на которой работает большинство серверов, есть гибкая и мощная система управления правами доступа. Настройка прав –– важный элемент конфигурирования сервера, который нужно понимать, чтобы не допускать возникновения ошибок и “дыр” в безопасности. И выполняется такая настройка только при помощи командной строки.

Другая частая проблема — это незнание команд по умолчанию при работе с редактором vim. Этот редактор часто открывается по умолчанию при работе с командной строкой и застаёт начинающих разработчиков врасплох: работа с ним отличается от работы с привычными редакторами текста. При входе в этот редактор он находится в так называемом командном режиме, и чтобы отредактировать текст, нужно сначала перейти в режим редактирования, нажав клавишу “i”. По завершении редактирования вам нужно выйти из этого режима и сохранить файл, что тоже делается определённым образом — не так, как в обычных текстовых редакторах: сначала нажать клавишу <Esc> (вернуться в командный режим), а затем ввести команду :wq, выполнение которой приведёт к сохранению изменений в файле (буква “w” означает “write” — от английского “записать”) и выходу из редактора vim (буква “q” означает “quit” — выход).

Какие есть аналоги bash

В различных операционных системах есть разные варианты командной строки bash. Например, в операционной системе Windows по умолчанию присутствуют терминалы командной строки cmd и PowerShell. Они во многом непохожи на bash, но тоже предоставляют широкий спектр возможностей при работе с Windows. В операционной системе macOS используется zsh, который похож на bash и в котором большинство основных команд идентичны командам в bash.

Как изучить bash и с чего начать

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

Например, команда просмотра содержимого папки ls имеет очень полезный ключи -l и -a, которые позволяют выводить содержимое папки в “полном” варианте — с отображением скрытых и системных файлов, с указанием прав доступа к ним, их размеров и дат изменения. Вот для сравнения результаты работы команды ls с этими параметрами и без них:

# ls

bin            composer.lock  config       migrations  README.md  symfony.lock  translations  vendor

composer.json  composer.phar  EXAMPLES.md  public      src        templates     var

# ls -la

total 3008

drwxrwxr-x 12 smb smb    4096 Jun 13 15:28 .

drwxrwxr-x  3 smb smb    4096 Jun  1 18:07 ..

drwxrwxr-x  2 smb smb    4096 Jun 12 08:25 bin

-rw-rw-r--  1 smb smb    2246 Jun 13 15:46 composer.json

-rw-rw-r--  1 smb smb  254785 Jun 13 15:46 composer.lock

-rw-rw-r--  1 smb smb 2719975 Jun  6 17:43 composer.phar

drwxrwxr-x  5 smb smb    4096 Jun 13 15:28 config

-rw-rw-r--  1 smb smb    1974 Jun 12 08:34 .env

-rw-rw-r--  1 smb smb     359 Jun 13 15:28 .env.example

-rw-rw-r--  1 smb smb     690 Jun 13 15:33 .env.local

-rw-rw-r--  1 smb smb     846 Jun 12 08:25 EXAMPLES.md

drwxrwxr-x  8 smb smb    4096 Jun 13 18:27 .git

-rw-rw-r--  1 smb smb     298 Jun 12 08:25 .gitignore

drwxrwxr-x  2 smb smb    4096 Jun 12 08:25 migrations

-rw-rw-r--  1 smb smb     969 Jun 12 08:25 .php-cs-fixer.dist.php

-rw-rw-r--  1 smb smb       4 Jun 12 08:25 .php-version

drwxrwxr-x  2 smb smb    4096 Jun 12 08:40 public

-rw-rw-r--  1 smb smb     621 Jun 12 08:25 README.md

drwxrwxr-x 10 smb smb    4096 Jun 12 08:34 src

-rw-rw-r--  1 smb smb   10491 Jun 13 15:28 symfony.lock

drwxrwxr-x  3 smb smb    4096 Jun 13 15:28 templates

drwxrwxr-x  2 smb smb    4096 Jun 12 08:34 translations

drwxrwxrwx  4 smb smb    4096 Jun 12 14:49 var

drwxrwxr-x 18 smb smb    4096 Jun 12 14:49 vendor

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

Помимо команд работы с файлами и папками стоит изучить команды для работы с правами доступа, а также принципы работы прав доступа. В примере выше права доступа к каждому файлу и к каждой папке указаны в начале. Например, у файла “.env” указано “-rw-rw-r--”, что означает, что владелец (пользователь smb) и члены группы пользователей smb имеют права на чтение и изменение этого файла, но не имеют прав на его запуск, а все остальные пользователи в системе имеют право только на чтение этого файла.

Также для начинающего разработчика важно уметь устанавливать и удалять программы, настраивать их, запускать и устанавливать, просматривать перечень текущих процессов, находить среди них нужные, смотреть, сколько ресурсов они потребляют, и, при необходимости, завершать их. Кроме того, важно разобраться с получением доступа к командной строке на сервере, настройкой авторизации по ключу и по паролю.

Комментарии (17)


  1. Myclass
    11.08.2022 15:41
    +4

    Почему каждый разработчик должен уметь пользоваться командной строкой bash

    40 лет работаю с компьютерами, свой первый спаял, мой первый язык был ассемблер, строкой bash, cmd и PowerShell редко пользуюсь, и не скажу, что умею — после прочтения такого громкого заголовка понял — прожил за-зря (#ирония)


  1. maledog
    11.08.2022 16:12
    +8

    Ну если занимаетесь образованием, то пишите нормальную статью. А это выглядит как заказной текст, который написал человек не очень разбирающийся в командной строке. Вы же даже не написали где нуб может справку получить. Как он по вашему должен запомнить все несколько страниц мануала curl?
    Если такой уровень преподавания, то не удивительно, что ваши курсы называют бесполезными.


  1. DMGarikk
    11.08.2022 16:44
    +4

    может я чет не понял, а где тут bash? все примеры это стандартный шелл

    баш, в моем понимание, это мозголомные скрипты и всякие удобные фишки для удобства в консоли


    1. yroman
      11.08.2022 17:05
      +4

      Это когда школьники не различают понятие shell и его реализацию, не зная, что реализаций может быть много. Отсюда и вырастают такие вот школостатьи.


  1. Vitaly83vvp
    11.08.2022 17:26
    +1

    Хм... тут под bash, наверное, имеется командная строка. С равным успехом можно было написать sh, cmd и что там ещё есть. Возможности bash (именно BASH, а не командной строки) куда шире.

    Больше напоминает урезанную версию того, что в универе про cmd рассказывали. Но там было больше команд и расписано подробнее.


  1. Akavvi
    11.08.2022 17:37

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

    Ого, а причем тут разработчик? Выглядит как будто человек написал статью, не зная о чем пишет и чем вообще занимается разработчик


  1. AccountForHabr
    11.08.2022 17:37

    Плохие примеры. Учат плохому. Не стоит деплоить сайты с помощью баша. Ваш кэп.


  1. pae174
    11.08.2022 23:46
    +5

    cd /var/www/html
    mkdir referral.symbioway.ru

    Где-то выше по тексту должно быть упомянуто sudo ибо этот ваш /var/www/html наверняка root:wheel 755.

    sed -i "s/test.symbio/referral.symbio" referral.symbioway.ru.conf
    Эта команда заменит в файле referral.symbioway.ru.conf все строки “test.symbio” на “referral.symbio”.

    Эта команда сначала ругнется вам на -i без последующего расширения (ну или у вас там какой-то альтернативный вариант sed).
    Потом, когда вы разберетесь с -i, она ругнется вам на незакрытую /.
    Потом, когда вы справитесь и с этим, она радостно поменяет вам не только test.symbio но и test1symbio, mytest.symbio и вообще всё, до чего дотянется по этой убогой регулярке. То есть результаты могут превзойти ваши ожидания.

    После чего вам нужно перезапустить Nginx:
    service nginx restart

    Желательно на боевом сервере вместо restart делать reload ибо reload только перечитывает конфиг а restart делает гораздо больше - всех закрывает, всё отменяет, рестартует и заново читает кэши (если они, конечно, у вас там есть).

    Создать файл index.php и записать в него строку, которая будет выводить текущую дату:

    echo "<? echo date('r');" > index.php

    Быстрее будет сделать php -r "date('r');". Зачем городить фигню с отдельным файлом.

    Пример использования bash

    Это не пример использования bash а пример использования нескольких утилит.


    1. Tangeman
      12.08.2022 01:48
      +1

      Гнушный sed (который уже давно заменил "классический") не ругнётся на -i без расширения, он просто не будет делать бэкап.


      1. pae174
        12.08.2022 23:23

        Я не знаю даже что хуже - ругань на отсутствие расширения или фанатичная уверенность в том, что резервная копия не нужна.


    1. HiSER
      12.08.2022 09:26

      Создать файл index.php и записать в него строку, которая будет выводить текущую дату:

      echo "<? echo date('r');" > index.php

      Ещё добавить, что автор пытается так проверить работает ли php на сервере, а на самом деле проверяет установлен ли PHP-CLI. Можно было просто тогда выполнить php -v.


      1. pae174
        12.08.2022 23:29

        Да ну может бедолага до сих пор юзает CGI. Такому и CLI нормально.


  1. 8amidov
    12.08.2022 09:08

    В названии статьи было бы лучше не указывать определенную вариацию командной строки, ибо в статье было подчеркнуто, что есть и другие разновидности. В главе "Как изучить bash и с чего начать" ожидалось увидеть ссылку на литературу, видеокурсы где пользователь может ознакомиться с азами работы с командной строки, подсказать ему пару команд не есть совет как изучить и с чего начать. Статью можно было закончить выводами, приведением плюсов, сравнением.


  1. Hungryee
    12.08.2022 09:13
    +1

    С какого, извините меня, перепугу каждый разработчик прямо-таки обязан пользоваться командной строкой (или все же башем?))

    С какого перепугу я должен отказываться от удобства бесконечного количества всемозможных гуи-клиентов? Отказываться от простоты и визуальности происходящего ради звания «настоящего программёра»? С таким же успехом каждый пользователь интернета может напрямую обращаться к атомарному апи веб-сайтов через postman, чтобы получить список статей/объект по id/ etc. Так выглядит идеальный мир? Да, уметь работать в терминале - это важно, но это не панацея. Если бы всемогущий баш не возводился в абсолют, людям не приходилось бы три тыщи лет колупаться в документациях и открытых issues на гитхабе, чтоб определить, что им делать с незапускающейся программой.

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


  1. AlexBream
    12.08.2022 11:14
    +1

    В операционных системах, устанавливаемых на обычные компьютеры, — Windows и macOS, — всегда есть командная строка bash, но обычными пользователями она используется редко или не используется совсем.

    В одном утверждении как минимум две ошибки:

    • в винде нет баша как CLI из коробки

    • "чрезмерная генерализация" в форме "... обычными пользователями она используется редко...", потому что не надо говорить за всех


  1. saboteur_kiev
    12.08.2022 13:42

    Смешались в кучу кони, люди.

    Уважаемый автор. Пожалуйста подучите терминологию и научитесь отличать CLI от bash. И вообще, почитайте в википедии определение и информацию про следующие термины: shell, cli, gui, sh, bash, zsh, powershell, command.com, и исправьте статью.

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


  1. aim
    12.08.2022 14:39
    +2

    В операционных системах, устанавливаемых на обычные компьютеры, — Windows и macOS, — всегда есть командная строка bash

    я прям чаем поперхнулся.