
Bash - это одна из самых распространенных командных оболочек Unix операционных систем. Чтобы понимать в принципе, что такое командная оболочка и зачем она нужна - нужно определиться с двумя подходами взаимодействия пользователя с компьютером: GUI и CLI. Также в вводном видео определимся с тем, что именно будет разбираться на протяжении всего курса.
00:00 - Введение
00:22 - Что нужно знать для прохождения курса
01:21 - GUI & CLI
02:39 - Командная оболочка shell
03:57 - Командная оболочка bash & zsh
04:46 - Что будет разбираться в курсе
05:22 - Зачем знать bash
Для работы с командной оболочкой shell, bash, zsh или какой-либо еще, нам необходимо разобраться с шаблоном написания любых команд. Ведь как мы помним из предыдущего видео, именно команды являются основным инструментом при работе в консоли. Также на видео разберем удобные способы чтение документации любых команд и попрактикуемся с некоторыми из них.
00:00 - Введение
00:26 - Общий шаблон всех команд
01:13 - Параметры команд
01:54 - Как найти документацию команд
02:45 - Примеры команд
04:35 - Базовые команды echo, clean, ls
06:35 - Документация команд через man
08:02 - Базовая команда wc
09:17 - Заключение
Чаще всего обычный пользователь работает с файловой системой: открывает, ищет, создает, перемещает различные директории и файлы. Поэтому наша задача в этом видео узнать основы файловой системы операционных систем и базовые команды работы с директориями.
00:00 - Введение
00:25 - Files & Directories
01:50 - Basic directory commands
03:24 - Absolute & relative paths
05:18 - Special directory symbols
08:55 - Заключение
Понятие переменной очень распространено в любых языках программирования - это временное хранилище какой-то информации. Командные оболочки - не исключение, они точно так же могут хранить переменные, причем как локальные, так и глобальные, которые еще принято называть переменными окружения (Environment variables). В этом видео мы особое внимание уделим такой переменной окружения как PATH, благодаря которой в принципе операционные системы unix ищут и выполняют любые введенные нами команды. Также затронем тему того, как сделать изменения переменных окружений постоянными.
00:00 - Введение
00:17 - How to create local variables
01:42 - String interpolation
02:18 - Environment variables. Commands export, printenv
04:42 - Environment variable PATH
08:42 - How to change environment variable permanently
Первый шаг на пути к тому, чтобы записать нашу собственную environment variable в файл - это научиться считывать информацию из текстовых файлов с помощью командной строки. В этом видео мы разберем 5 базовых операций чтения текстовых файлов и нюансы использования каждой из них.
00:00 - Введение
00:35 - Базовые команды для чтения текстовых файлов
02:02 - Команда cat
04:07 - Команда nl
05:05 - Команды head & tail
06:06 - Команда less
07:52 - Заключение
Второй этап на пути к созданию своей environment variable - это разобраться с основами потоков ввода-вывода в unix operating systems. Для этого как обычно на диаграммах мы познакомимся с тем, что по факту ввод и вывод команд - это всего лишь массив байт (ключевой момент в понимании последующих тем). На видео также узнаем, что существуют потоки ввода-вывода по умолчанию для команд, которые можно без проблем менять в последующем.
00:00 - Введение
00:25 - input & output of commands
01:15 - Standard Input, Standard Output, Standard Error
03:27 - input & output & error examples
04:52 - How to change Standard Output
06:40 - How to change Standard Error
08:06 - Combine both Standard Output & Standard Error
10:38 - Заключение
Наконец-то мы обладаем всем необходимым багажом знаний, чтобы суметь добавить свою собственную environment variable на постоянной основе. И для этого существуют специальные зарезервированные имена файлов в зависимости от используемой командной оболочки: .bash_profile и .bashrc - для bash; .zprofile и .zshrc - для z shell. Также на видео рассмотрим такую команду как source и ее аналог - . (dot).
00:00 - Введение
00:47 - Special files .bash_profile, .bashrc & .zprofile, .zshrc
02:20 - Add environment variables to .zshrc
04:45 - Command source (or .)
07:22 - Заключение
На занятии по основам потоков ввода-вывода в unix operating systems мы поняли ключевой момент: как input так и output используют массив байт. А это значит, что output одной команды мы можем использовать как input для другой. И таким образом мы можем продолжать довольно долго, создавая огромные конвейеры команд или по-другому Pipes. Также в видео поговорим о комбинации команд через специальные символы ; && ||.
00:00 - Введение
00:30 - Конвейер команд (Pipes)
01:25 - Pipes examples
03:36 - Commands combination via (; && ||)
06:06 - Заключение
На этом видео мы в совершенстве овладеем переиспользованием уже набранных ранее команд, чтобы значительно увеличить нашу производительность и уменьшить время набора новых команд. Также затронем тему размера истории команд и как ее почистить полностью.
00:00 - Введение
00:25 - Files .bash_history & .zsh_history
01:39 - Поиск и итерация по истории команд
02:49 - Команда history
04:48 - HISTSIZE variable
06:56 - Clean all commands via history -c
На текущий момент в списке известных нами команд все еще не хватает тех, что работают с директориями. А ведь работа с директориями - это довольно тривиальная и часто встречающаяся практика. Поэтому в этом видео мы поговорим про базовые команды, которые используются при работе с директориями, чтобы без проблем их создавать, удалять и извлекать информацию о их имени или части этого имени.
00:00 - Введение
00:20 - cd & pwd commands
00:48 - basename & dirname commands
03:10 - mkdir command
05:09 - rmdir command
07:47 - rm -r command
08:28 - Резюме
В Unix operating systems все представлено в виде файлов. Даже директории - это тоже файлы, просто особого типа. Мы будем не раз обращаться к этому моменту в последующем, тем не менее на этом видео мы разберем базовые операции при работе с любыми файлами: ls для отображения содержимого директории, cp - для копирования как отдельно взятого файла так и всего содержимого директории рекурсивно, mv - для перемещения и переименования файлов и rm - для их удаления.
00:00 - Введение
00:12 - ls command
01:03 - cp command
05:14 - mv command
08:05 - rm command
10:02 - Резюме
Для понимая дальнейших тем этого курса, например, таких как hard & soft links, permissions, user management и многое другое, нам необходимо капнуть глубже в устройство Unix operating systems и разобраться с таким понятием как inodes. Зачем они нужны, почему они дополнительно хранятся вместе с именем файлов и директорий в дереве каталогов и как получить мета информацию от этих файлов и директорий с помощью inode number.
00:00 - Введение
00:15 - inode number
01:24 - File metainformation (inode table)
03:31 - Storage blocks addresses
06:28 - df command
07:48 - Резюме
У нас уже достаточный багаж знаний из предыдущих занятий (особенно благодаря теме inodes) для того, чтобы осознать: что такое ссылка на файл и в чем разница между двумя видами ссылок soft (symbolic) и hard. На видео поговорим о различных ограничениях ссылок, подводных камнях и где чаще всего встречаются и используются ссылки.
00:00 - Введение
00:21 - Hard & soft (symbolic) links theory
03:50 - ln -s command (soft link)
06:03 - ln command (hard link)
07:20 - Create a soft link on the directory
07:55 - Резюме
Мы прошли все 3 основные операции, которые можем выполнять с файлами - это чтение (read), запись (write) и выполнение (execute). Но к сожалению, мы не умеем редактировать содержимое файлов. Нам известны только операции добавление строк в конец файла или полная его перезапись. Поэтому на этом видео мы познакомимся с двумя основными текстовыми редакторами, которые используются практически в любых unix операционных системах: nano и vim (vi). Они и позволят нам менять содержимое любых текстовых файлов.
00:00 - Введение
00:23 - Три основные текстовые редакторы
01:34 - Текстовый редактор nano
05:06 - Текстовый mode-based редактор vim (vi)
10:26 - Заключение
На этом видео мы разберем базовые команды для манипулирования текстовой информацией, которые встречаются на практике чаще всего, потому что на самом деле их количество невероятно большое. Также узнаем новый формат представления текстовых данных csv и удобную команду cut при работе с любой табличной информацией.
00:00 - Введение
00:26 - Базовые команды для манипулирования текстовой информацией
01:44 - cut command
05:28 - sort command
07:37 - uniq command
08:30 - tee command
09:24 - Резюме
Регулярные выражения - это невероятно мощное и часто встречаемое средство для извлечения нужных данных из текстовой информации. Более подробно мы изучали эту тему на курсе Java Level 2, тем не менее, регулярные выражения используются вне зависимости от языка программирования. На этом видео мы рассмотрим как в командной оболочке для этого использовать команду grep, которая работает в двух основных режимах: basic и extended.
00:00 - Введение
00:20 - Что такое регулярное выражение
02:52 - grep command
04:18 - grep extended mode (egrep)
07:24 - Резюме
Мы знаем как вручную создавать директории, вкладывая их в другие директории и т.д. Тем самым мы структурируем дерево каталогов, чтобы быстро искать по нему информацию. Но даже в таком случае при большом количестве файлов и каталогов ручной поиск будет занимать у нас довольно много времени. Поэтому у нас есть специальные команды, которые помогают искать местонахождения различных программ, файлов и директорий на жестком диске. Также на видео поговорим про то, как создавать различные псевдонимы (alias) для команд.
00:00 - Введение
00:34 - File Location commands
01:18 - Переключение между командными оболочками
01:51 - which command
02:30 - type command
03:06 - alias
04:45 - whereis command
05:51 - locate command
06:41 - find command
12:48 - xargs command
13:32 - Резюме
На текущий момент мы знаем, как изменять содержимое файлов и директорий. Но как мы помним из предыдущего видео по теме inode, существует еще много другой мета информации у файлов (например, тип файла, его размер, дата создания, изменения, права доступа, и т.д.), которую точно также как и содержимое его - можно просматривать и изменять. Поэтому на видео мы рассмотрим базовые команды для просмотра и изменения мета информации файлов (кроме тех, что относятся к правам доступа).
00:00 - Введение
00:55 - Команды для изменения file meta-information
01:29 - stat command
03:20 - file command
04:50 - du command
07:40 - touch command
Следующая мета информация файла, которую мы можем захотеть не только просматривать, но и изменять - это пользователь. На видео мы разберемся с понятием "пользователь" и какие команды есть для его создания, удаления, изменения и т.д. Также узнаем о том, что на всех unix операционных системах изначально существует как минимум один пользователь - super user, у которого есть доступ ко всем ресурсам системы, и его часто именуют как root.
00:00 - Введение
00:13 - Что такое пользователь (super user)
01:52 - whoami command & sudo
02:55 - id, who, users commands
04:01 - User management commands
04:40 - chown command
Следующая мета информация файла, которую мы можем захотеть не только просматривать, но и изменять - это группы. На видео мы разберемся с понятием "группа" и какие команды есть для ее создания, удаления, изменения и т.д.
00:00 - Введение
00:22 - Что такое группа
01:13 - groups command
01:53 - Group management commands
02:16 - chgrp command
04:03 - chgrp with group id
05:08 - Резюме
На предыдущих двух занятиях мы разобрались с такой мета-информацией файлов как пользователи и группы. Но на самом деле, ключевой момент в правах доступа заключается не в этих двух полях файла, а в совсем другой: permission modifiers, которая идет самой первой колонкой в выводе команды ls. На видео мы рассмотрим 3 варианта представления прав доступа файлов и директорий (Octal, Binary, Symbolic) и попробуем изменять их с помощью специальной команды chmod.
00:00 - Введение
00:32 - Permission modifiers
03:42 - chmod command (symbolic)
07:11 - chmod command (octal)
09:46 - chmod -R
10:43 - Резюме
В настоящее время распространено общение между компьютерами по сети. И командная оболочка bash - не исключение, поэтому точно также предоставляет возможность подключаться к удаленным машинам и выполнять какие-либо команды. На этом видео мы в теории разберем 4 основных шага для подключения к удаленной машине и 3 базовые команды при работе по сети.
00:00 - Введение
00:27 - 4 steps to connect to remote host
02:35 - Host Location commands
02:46 - host command
04:13 - ping command
05:20 - traceroute command
06:27 - Заключение
На этом занятии мы попробуем на практике воспроизвести 4 шага, чтобы успешно подключиться к удаленной машине. Т.е. мы создадим удаленную машину, создадим своего пользователя там, предоставим ему пароль и изучим команду ssh. Удаленную машину мы будем имитировать с помощью Docker container, конфигурацию и запуск которого также будет продемонстрировано на видео.
00:00 - Введение
00:46 - Remote Machine via Docker container
01:43 - Dockerfile configuration
03:22 - Build and run Docker container
04:48 - ssh command
07:33 - Резюме
На предыдущем занятии мы увидели, как с помощью логина и пароля (password authentication) подключаться к удаленным машинам. Но на практике используется гораздо чаще именно public key authentication. Поэтому на этом занятии мы рассмотрим более подробно этот вид аутентификации, изучим новую команду ssh-keygen для генерации пар ключей (public & private) и подключимся к удаленной машине с помощью уже известной нам команды ssh.
00:00 - Введение
00:29 - What is public key auth?
02:24 - The Code Book
02:44 - ssh-keygen command
04:18 - Dockerfile configuration
06:06 - ssh based on public key auth
Для взаимодействия между удаленными машинами можно использовать две другие часто встречаемые команды: scp и sftp. Они очень полезны при копировании информации (файлов, директорий, различных программ и т.д.) и, наоборот, скачиванию этой информации с и на удаленную машину. На видео более подробно на практике рассмотрим принцип работы с каждой из этих команд.
00:00 - Введение
00:50 - scp command
04:54 - sftp command
10:13 - Резюме
Команды ssh для подключения к удаленным машинам выглядит довольно громоздко: нам приходится указывать довольно много различных special options. Поэтому здорово было бы иметь что-то вроде alias как при написании обычных команд. И на самом деле такой механизм существует и он называется ssh config. Как создавать этот текстовый файл, где он должен лежать и его формат - все это мы разберем на видео.
00:00 - Введение
01:07 - File ~/.ssh/config
01:40 - ssh config format
02:57 - Add ubuntu-ssh into ssh config
05:05 - Тестирование ssh config
Вот мы и дошли до заключительной темы этого курса - написание Bash Scripts. На вводном занятии мы поговорим о том, как создавать Bash Scripts, best practices по именованию, как правильно запускать их (даже из любого места на вашем компьютере) и code convention (т.к. это практически язык программирования со своими правилами и best practices). Также вернемся к теме создания переменных, неявных типов данных и Input & Output при написании скриптов.
00:00 - Введение
01:12 - Создание файла, который является Bash Script
02:41 - Запуск Bash Script
04:48 - Shell Style Guide
05:30 - Shell variables
06:24 - Data types
09:47 - Input & Output
10:48 - Резюме
Shell Expansions - это основы при написании Bash Scripts, которые являются что-то вроде "подстановок" в коде. Bash их выполняет автоматически, если встречает одну из 7 таких ситуаций. На видео мы проработаем каждую из них, но более подробно сможем закрепить на последующих занятиях (особенно на практическом), потому что все они встречаются невероятно часто.
00:00 - Введение
00:28 - 1. Brace expansion
02:20 - 2. Tilde expansion
03:04 - 3. Parameter & variable expansion
05:08 - 4. Command substitution
06:34 - 5. Arithmetic expansion
07:47 - 6. Filename expansion
09:20 - 7. Word splitting
Как мы поняли из предыдущих занятия - в Bash только 3 неявных типа данных: строки, целые числа и массива. Но из computer science мы знаем, что для выполнения логических и условных конструкций - нам необходим тип данных Boolean. Поэтому Bash для этих целей использует числа, где 0 - это true (success), а все остальные значения - это false (failure). И для выполнения различных логических операций используется специальная команда test, которую мы и разберем подробно в видео.
00:00 - Введение
00:15 - Boolean type in Bash
01:20 - Exit status code
03:28 - test command
06:22 - Concise form of test: [], [[]], (())
08:23 - Резюме
Существует 2 основные условные конструкции, которые встречаются практически во всех языках программирования: это if-else и case (pattern matching). На видео мы разберем каждый из них, убедившись, что эти конструкции в Bash Scripts невероятно похожи синтаксисом на те же самые конструкции в других языках программирования. Также разберем как пользоваться командной строкой из среды разработки IntelliJ IDEA, чтобы не переключаться между различными программами.
00:00 - Введение
00:12 - if-else
03:17 - IntelliJ IDEA Terminal
04:02 - case
07:28 - Резюме
При написании Bash Scripts можно использовать 3 различные инструкции циклов: while, until и for, который в свою очередь также представлен двумя различными вариантами (for index и for each). На видео мы подробно разберемся с каждым видом цикла и решим несколько примеров для самого распространенного на практике цикла - это for each.
00:00 - Введение
00:45 - while loop
02:39 - until loop
03:49 - for index loop
05:48 - for each loop
07:25 - for each example 1
10:38 - for each example 2
12:10 - Резюме
Заключительная тема из computer science, которую мы еще не изучили - это написание функций и передача аргументов (как в функции, так и при вызове других Bash Scripts). Поэтому на видео мы разберем: как объявлять и вызывать функции, как использовать и передавать аргументы, как получать возвращаемое значение и зачем писать документацию к каждой функции.
00:00 - Введение
00:43 - Function declaration
02:06 - Function arguments
04:50 - Script arguments
05:31 - Function return value
07:30 - local variables
08:07 - Add function description (doc)
09:18 - Резюме
На заключительном практическом занятии по курсу Bash мы попробуем воспользоваться всеми полученными знаниями с предыдущих тем для написания своей утилитной программы application, которая будет представлять собой обычный Bash Script и которая будет содержать несколько вспомогательных команд: help, init, clean, build, up. На протяжении всего видео мы будем придерживаться best practices при написании любых команд, переменных, логических конструкций и т.д.
00:00 - Введение
00:21 - Task description
01:28 - Task requirements
02:05 - help command
05:10 - init command. workDir
09:29 - init command. Git
11:06 - init command. Docker
17:30 - clean command
20:03 - build command
25:40 - up command
27:45 - Резюме
По традиции на заключительном занятии курса Bash мы поговорим про дальнейший путь развития нас как разработчиков. Также вернемся к теме об источниках информации, которые можно использовать чтобы еще больше углубиться в тему Bash, написания Bash Scripts, или просто как хороший справочник команд.
00:00 - Введение
00:28 - Java Road Map
01:07 - Shell Style Guide
01:32 - Bash Reference Manual
02:00 - Book: Linux Pocket Guide
02:18 - Резюме
Для успешного прохождения этого курса необходимо всего лишь:
- базовое понимание и опыт работы с Unix operating systems
- основы алгоритмизации и программирования
Другими словами говоря, этот курс рассчитан на людей практически с нуля.
В нем будут разобраны основы, самые важные и полезные аспекты, которые необходимы каждому разработчику:
- принципы работы и устройство bash
- часто встречаемые команды
- написание bash скриптов
Зачем нужен bash?
Подавляющее большинство приложений (особенно Java приложений) разрабатываются и разворачиваются на Unix операционных системах (Linux, MacOS). Поэтому в любом случае каждый разработчик столкнется с командной строкой, а значит и bash: либо на локальном компьютере, либо удаленно подключиться к серверу для его настройки и выполнения команд.
Пройдя этот курс, ты уверенно будешь владеть любыми командными оболочками (особенно bash и Z shell). Сможешь комфортно себя чувствовать как со знакомыми и часто встречаемыми командами, так и новыми, потому что ты будешь знать как подходить к их изучению и в последующем использовать любые команды (и даже написать свои!).
Более того, ты поймешь основы потоков ввода-вывода, что означает Standard Input, Standard Output и Standard Error, также перенаправлять их от окна командной оболочки (консоли) в файлы и даже другие команды. Потому что любые входные и выходные параметры - это всего лишь массив байт, т.е. универсальный тип данных. И более того, все в Unix операционных системах - представлено в виде файлов.
В заключительной части курса ты в совершенстве овладеешь навыком написания полноценных bash скриптов, которые можно использовать как отдельные программы, так и для автоматизации любых процессов на локальной или даже удаленной машине.