Командная строка в операционной системе 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)
maledog
11.08.2022 16:12+8Ну если занимаетесь образованием, то пишите нормальную статью. А это выглядит как заказной текст, который написал человек не очень разбирающийся в командной строке. Вы же даже не написали где нуб может справку получить. Как он по вашему должен запомнить все несколько страниц мануала curl?
Если такой уровень преподавания, то не удивительно, что ваши курсы называют бесполезными.
DMGarikk
11.08.2022 16:44+4может я чет не понял, а где тут bash? все примеры это стандартный шелл
баш, в моем понимание, это мозголомные скрипты и всякие удобные фишки для удобства в консолиyroman
11.08.2022 17:05+4Это когда школьники не различают понятие shell и его реализацию, не зная, что реализаций может быть много. Отсюда и вырастают такие вот школостатьи.
Vitaly83vvp
11.08.2022 17:26+1Хм... тут под bash, наверное, имеется командная строка. С равным успехом можно было написать sh, cmd и что там ещё есть. Возможности bash (именно BASH, а не командной строки) куда шире.
Больше напоминает урезанную версию того, что в универе про cmd рассказывали. Но там было больше команд и расписано подробнее.
Akavvi
11.08.2022 17:37Также для начинающего разработчика важно уметь устанавливать и удалять программы, настраивать их, запускать и устанавливать, просматривать перечень текущих процессов, находить среди них нужные, смотреть, сколько ресурсов они потребляют, и, при необходимости, завершать их.
Ого, а причем тут разработчик? Выглядит как будто человек написал статью, не зная о чем пишет и чем вообще занимается разработчик
AccountForHabr
11.08.2022 17:37Плохие примеры. Учат плохому. Не стоит деплоить сайты с помощью баша. Ваш кэп.
pae174
11.08.2022 23:46+5cd /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 а пример использования нескольких утилит.
HiSER
12.08.2022 09:26Создать файл index.php и записать в него строку, которая будет выводить текущую дату:
echo "<? echo date('r');" > index.php
Ещё добавить, что автор пытается так проверить работает ли php на сервере, а на самом деле проверяет установлен ли PHP-CLI. Можно было просто тогда выполнить php -v.
8amidov
12.08.2022 09:08В названии статьи было бы лучше не указывать определенную вариацию командной строки, ибо в статье было подчеркнуто, что есть и другие разновидности. В главе "Как изучить bash и с чего начать" ожидалось увидеть ссылку на литературу, видеокурсы где пользователь может ознакомиться с азами работы с командной строки, подсказать ему пару команд не есть совет как изучить и с чего начать. Статью можно было закончить выводами, приведением плюсов, сравнением.
Hungryee
12.08.2022 09:13+1С какого, извините меня, перепугу каждый разработчик прямо-таки обязан пользоваться командной строкой (или все же башем?))
С какого перепугу я должен отказываться от удобства бесконечного количества всемозможных гуи-клиентов? Отказываться от простоты и визуальности происходящего ради звания «настоящего программёра»? С таким же успехом каждый пользователь интернета может напрямую обращаться к атомарному апи веб-сайтов через postman, чтобы получить список статей/объект по id/ etc. Так выглядит идеальный мир? Да, уметь работать в терминале - это важно, но это не панацея. Если бы всемогущий баш не возводился в абсолют, людям не приходилось бы три тыщи лет колупаться в документациях и открытых issues на гитхабе, чтоб определить, что им делать с незапускающейся программой.
Статья бестолковая, программный директор директор умеет в первые пару ссылок гугла
AlexBream
12.08.2022 11:14+1В операционных системах, устанавливаемых на обычные компьютеры, — Windows и macOS, — всегда есть командная строка bash, но обычными пользователями она используется редко или не используется совсем.
В одном утверждении как минимум две ошибки:
в винде нет баша как CLI из коробки
"чрезмерная генерализация" в форме "... обычными пользователями она используется редко...", потому что не надо говорить за всех
saboteur_kiev
12.08.2022 13:42Смешались в кучу кони, люди.
Уважаемый автор. Пожалуйста подучите терминологию и научитесь отличать CLI от bash. И вообще, почитайте в википедии определение и информацию про следующие термины: shell, cli, gui, sh, bash, zsh, powershell, command.com, и исправьте статью.
Название статьи - верное. Каждый разработчик должен уметь пользоваться командной строкой. Но если бы статья была... ну не то, чтобы грамотная, но хотя бы правильно термины использовались.
А так - вы только спугнули.
aim
12.08.2022 14:39+2В операционных системах, устанавливаемых на обычные компьютеры, — Windows и macOS, — всегда есть командная строка bash
я прям чаем поперхнулся.
Myclass
40 лет работаю с компьютерами, свой первый спаял, мой первый язык был ассемблер, строкой bash, cmd и PowerShell редко пользуюсь, и не скажу, что умею — после прочтения такого громкого заголовка понял — прожил за-зря (#ирония)