Основы BASH для новичков
В этой статье рассмотрим несколько наиболее эффективных BASH-команд и узнаем об их полезности.
Вы когда-нибудь замечали, как супер-ботаник хакер в кино может легко проникнуть в самые безопасные банки и ограбить их все, просто набрав несколько команд, яростно уставившись в зеленый экран с черным фоном? Как человек последовательно получает доступ ко всем паролям и берет под контроль скрытые камеры, где бы он ни находился, всего несколькими нажатиями клавиш на клавиатуре. Ну, я не уверен, откуда у кинематографистов это взялось, но, наверное, это их способ сказать нам, что командная строка - это мощный инструмент, и без всех этих хакеров и ACCESS GRANTED!! До смешного..
Часто новички настолько привыкли работать с графическим интерфейсом GUI, что склонны игнорировать возможности интерфейса командной строки (CLI). Мышь очень удобна, когда нужно скопировать в папку около ста тысяч файлов, но что, если переименовать все эти тысячи файлов или разделить их по расширениям? Так как графические интерфейсы не программируемы, то переименование или разделение их с помощью командной строки заняло бы целую вечность, однако, мы могли бы быстро добиться этого за несколько строк кода.
Unix shell является довольно мощным инструментом для разработчиков всех видов. Эта статья призвана дать краткое введение в самые основы, начиная с операционной системы UNIX.
UNIX
Большинство современных операционных систем, за исключением WINDOWS, построены на базе UNIX. Среди них много дистрибутивов Linux, macOS, iOS, Android и др. Достаточно одного взгляда на схему развития операционных систем, основанных на UNIX, чтобы подчеркнуть важность UNIX, и именно по этой причине она стала широко использоваться на производстве. На самом деле, бэк-энд многих вычислительных систем, включая такие промышленные гиганты, как Facebook и Google, в значительной степени используют UNIX.
Shell
Shell - это интерфейс командной строки для запуска программ на компьютере. Пользователь набирает в строке запроса кучу команд, оболочка запускает программы для пользователя, а затем выводит результат. Команды могут быть либо введены непосредственно пользователем, либо прочитаны из файла, называемого shell-скриптом или shell-программой.
Shell. Какие бывают
UNIX-система обычно предлагает различные типы оболочек shell. Некоторые из них наиболее распространены:
Однако в этой статье мы ограничимся оболочкой Bash. Тем не менее, вам рекомендуется прочитать и попробовать другие оболочки, особенно zsh, так как уже в версии MacOS под названием Catalina zsh заменил оболочку bash. Так что будет хорошей идеей познакомиться с ним сейчас.
Terminal
Терминал - это программа, которая используется для взаимодействия с оболочкой. Это просто интерфейс к оболочке и к другим программам командной строки, которые запускаются внутри нее. Это похоже на то, как веб-браузер является интерфейсом для веб-сайтов. Вот как выглядит типичный терминал в Mac:
У Mac и Linux есть соответствующие версии терминала. Windows также имеет встроенную командную оболочку, но она основана на командной строке MS-DOS, а не на UNIX. Так что давайте посмотрим, как мы можем установить шелл и программу терминала в операционной системе Windows, которая работает так же, как и в системах Mac и Linux.
Установка терминала в WINDOWS
- Подсистема Windows для Linux (WSL)
Это новая система совместимости с Linux в Windows 10. WSL позволяет разработчикам запускать GNU/Linux окружение - включая большинство инструментов командной строки, утилит и приложений - прямо под Windows, без изменений, без дополнительных виртуальных машин. Подробнее о его установке и функциях вы можете прочитать здесь.
- Git Bash
Git Bash - это то, что мы будем использовать в этой статье. Скачайте Git на компьютер с Windows отсюда и установите его со всеми настройками по умолчанию. В конце концов, вы получите окно терминала, вроде того, что показано ниже.
Изучение терминала
Всякий раз, когда мы открываем окно терминала, мы видим наши последние учетные данные для входа и приглашение Shell. Строка shell появляется всякий раз, когда оболочка готова принять входные данные. Она может немного отличаться в зависимости от дистрибутива, но в основном она отображается как имяпользователя@имякомпьютера, за которым следует знак $.
Если вам не нужна вся эта информация, вы можете использовать PS1 для настройки командной строки.
Теперь терминал будет показывать только $ в строке. Однако это только временно и после перезапуска терминал вернется к своим первоначальным настройкам.
Приступим
Чтобы немного развлечься, давайте начнем с нескольких простых команд:
- echo: выводит все, что вы набираете в командной строке шелла, аналогично Print на Python.
- date: отображает текущие время и дату.
- cal: отображает календарь на текущий месяц.
- clear: очистит окно терминала, также можно использовать сочетание клавиш Ctrl-L.
Основные команды Bash
Команда bash - наименьшая единица кода, которую bash может выполнить самостоятельно. Эти команды говорят bash, что нам нужно, чтобы он сделал. Обычно bash принимает от пользователя одну команду и возвращается к пользователю после ее выполнения.
Рабочая директория
pwd
pwd выводит содержимое рабочей директории и указывает на текущую рабочую директорию, то есть на директорию, которую оболочка просматривает в данный момент. Это также место по умолчанию, где команды оболочки будут искать файлы данных.
Директория похожа на папку, но в shell мы будем придерживаться наименования директория (каталог). Файловая иерархия UNIX имеет древовидную структуру. Чтобы добраться до определенной папки или файла, нам нужно пройти по определенным путям внутри этой древовидной структуры. Пути разделяют каждый узел вышеуказанной структуры с помощью символа слэш( / ).
Навигация по директориям
Для навигации и организации файлов используются команды ls и cd.
ls
ls обозначает список и показывает содержимое директории. ls обычно начинает с просмотра нашего домашнего каталога. Это означает, что если мы вызовем команду ls самостоятельно, то он всегда выведет содержимое текущего каталога, которым в моем случае является /Users/parul.
Параметры команды
Параметры и опции включают некоторые специальные функции при использовании команды ls.
- ls <папка> : для просмотра содержимого определенной папки.
- ls -a: Для перечисления всех скрытых файлов в папке
- ls -l: Выводитболее длинный и подробный список файлов. ls -l также может быть использован с именем каталога для перечисления файлов этого конкретного каталога.
- ls ~: tilde(~) - сокращение, обозначающее домашний каталог. Таким образом, независимо от того, в какой директории мы находимся, ls ~ всегда будет показывать содержимое домашнего каталога.
Немного о масках файлов
Оболочка также позволяет нам сопоставлять имена файлов с шаблонами, обозначенными звездочкой(*). Она служит подстановочным знаком для замены любого другого символа внутри заданного шаблона. Например, если мы введем *.txt, то это приведет к перечислению всех файлов с расширением .txt. Давайте попробуем перечислить все файлы с расширением .py в нашей папке Demo:
cd
cd, дословно, означает Change Directory (Изменить директорию) и изменяет активную директорию на указанный путь. После того, как мы используем cd в нужную директорию, можно воспользоваться командой ls, чтобы увидеть содержимое ее содержимое. Давайте посмотрим, как можно использовать эту команду:
- cd ... : Чтобы вернуться в родительский каталог.
- cd : Для возврата в домашний каталог
Организация файлов
Существуют определенные команды, которые позволяют нам перемещать, удалять, создавать и копировать файлы из самой оболочки.
mkdir
mkdir означает Make directory и используется для создания новой директории или папки.
mv
mv означает Move и перемещает один или несколько файлов или каталогов из одного места в другое. Нам нужно указать, что мы хотим переместить, т.е. источник и куда мы хотим переместить их, т.е. место назначения.
Создадим в папке Demo новую директорию PythonFiles и переместим в нее все .py-файлы из папки Demo, используя две вышеприведенные команды.
touch
Команда touch используется для создания новых пустых файлов. Она также используется для изменения временных меток на существующих файлах и каталогах. Вот как мы можем создать файл под названием foo.txt в папке Demo.
rm
Команда rm означает "Удалить" и удаляет файлы или каталоги. По умолчанию она не удаляет каталоги, но если используется как rm -r * внутри каталога, то удаляется каждый каталог и файл внутри этого каталога.
Теперь удалим ранее созданный файл foo.txt.
rmdir
rmdir означает "удалить каталог" и используется для удаления пустых каталогов из файловой системы. Давайте удалим папку PythonFiles, которую мы создали некоторое время назад.
Обратите внимание, что ../ обозначает родительский каталог.
Просмотр файлов
Это еще один нюанс использования оболочки shell, который очень полезен. Существуют команды, которые помогают нам просматривать содержимое файла, чтобы мы могли ими манипулировать.
cat
Команда cat читает файл и выводит его содержимое. Она может читать любое количество файлов, как следует из ее наименования. В нашей папке Demo есть несколько текстовых файлов, давайте используем cat, чтобы просмотреть их содержимое.
Чтобы просмотреть более одного файла, укажите оба имени файлов после команды cat:
$ cat Names.txt fruits.txt
less
Команда cat отображает содержимое файла на экране. Это нормально, когда содержимого мало, но это становится проблемой, когда файл большой. Как видно из примера ниже, команда выводит все на терминал с очень высокой скоростью, и мы не можем разобраться во всем содержимом файла. К счастью, есть команда под названием "Меньше", которая позволяет нам просматривать содержимое по одному экрану за раз.
$ less babynames.txt
Существуют определенные варианты с меньшим количеством используемых опций:
Пробел: перейти к следующему экрану
b: перейти к предыдущему экрану
/: для поиска конкретного слова
q: выйти
man
Команда man отображает страницы мануалов, которые являются руководством пользователя, встроенным по умолчанию во многие Linux и большинство Unix операционных систем.
man bash : Чтобы отобразить всю инструкцию bash
man <ключевое слово>, например man ls выдает информацию о команде ls.
Каналы и фильтры
Оператор pipe '|' (вертикальная полоса) - это способ отправки вывода одной команды в качестве входной для другой команды.
command1 | command2
Когда команда посылает свой выход в канал, принимающей стороной для этого выхода является другая команда, а не файл. На рисунке ниже показано, как команда wc подсчитывает содержимое файла, отображенного командой cat.
wc - это команда, которая принимает данные на входе и каким-то образом преобразует их вывод. Такие команды называются фильтрами и помещаются после Unix каналов.
Фильтры
Теперь давайте посмотрим на некоторые часто используемые команды фильтров. Мы будем работать с файлом под названием babynames.txt, который содержит около 1000 имен детей, и с файлом fruits.txt, который содержит имена нескольких фруктов.
- grep или глобальное регулярное выражение ищет строки с заданной строкой или ищет шаблон в заданном входном потоке и выводит результат. Следующая команда прочитает все файлы и выведет все строки, содержащие либо слово 'Tom'.
Но получился большой список, и мы не можем разобраться во всех этих данных, только что выведенных в терминале. Давайте посмотрим, как мы можем использовать оператор pipe, чтобы разобраться в этом.
- Фильтр wc - это сокращение от количества слов (word count). Он читает список файлов и генерирует одну или несколько следующих статистик: количество новых строк, количество слов и количество байтов. Введем в wc вывод вышеприведенной команды grep для подсчета количества строк, содержащих слово 'Tom'.
- Фильтр sort сортирует строки в алфавитном или цифровом порядке.
Команда cat сначала читает содержимое файла fruits.txt, а затем сортирует его.
- Фильтр uniq означает "уникальный" и дает нам количество уникальных строк во входном потоке.
Важно отметить, что uniq не может обнаружить дубликаты записей, если они не находятся рядом. Поэтому мы использовали сортировку файла перед использованием команды сортировки. В качестве альтернативы можно также использовать команду sort -u вместо uniq.
Каналы очень удобны для выполнения некоторых сложных задач, так как несколько команд могут быть объединены в один канал вывода.
Что изучить еще по теме?
Инструменты командной строки могут быть отличным дополнением к основному набору инструментов. Первоначально терминал может напугать новичков, но как только они его освоят, его реальные достоинства и преимущества могут быть реализованы. Данная статья призвана заставить начинающего пользователя начать изучение терминала только поверхностно. В сети доступно множество полезных ресурсов, позволяющих детально изучить и узнать об оболочке. Вот некоторые из рекомендуемых ресурсов (на английском):