Перед чтением этой статьи рекомендуем ознакомиться с разделом Создание скрипта статьи Знакомство с bash. В нём объяснены основные термины, которые встречаются в этой статье.
Во второй статье серии о bash-скриптах даем рекомендации по их составлению и подробно рассматриваем основные команды Linux.
Основные команды
Ниже приведены команды Unix, наиболее часто используемые в bash — в основном для работы с файлами и обработки текстов.
Не все они используются в скриптах непосредственно, но для работы с командной строкой необходимы.
Для каждой команды даны пояснения, синтаксис (правила записи), примеры применения и часто используемые опции.
Несколько опций одной утилиты записывают после дефиса без пробелов:
ls -lat
man
Выход: |
less
Листать страницы: пробел Выход: |
cat
|
ls
|
cd
|
cp
|
mv
|
rm
|
touch
|
mkdir — создать новый каталог
|
sort
|
grep — искать в файле или каталоге указанную последовательность символов, включая подстановочные знаки. По умолчанию учитывается регистр символов
Симлинк (символическая ссылка) — специальный файл, содержащий только путь к файлу, на который ссылается (целевому файлу). При обращении к симлинку открывается целевой файл. |
find
Пояснения: {} — заглушка: вместо неё подставляется путь к каждому найденному файлу, с которым будет выполнена <команда>. \; — разделитель команд с экранированием при помощи обратного слэша \: выполнять <команду> для каждого найденного объекта
|
locate
|
ping — проверить, доступен ли указанный хост по сети для обмена эхо-запросами. Обычно это первый способ диагностики связи между хостами. Утилита
|
wget — загрузить файл по сети в текущий каталог
|
du — отобразить объём занятого дискового пространства в указанном каталоге (либо в текущем, если каталог не указан)
|
df
|
htop В верхней части экрана показаны текущие значения потребления системных ресурсов (% использования ЦА, МБ памяти), в средней — динамически изменяющийся список системных процессов. Чем больше ресурсов использует процесс, тем выше он в списке.
Завершить или приостановить процесс:
|
kill — завершить зависший процесс
|
Другие способы использовать команду trap для отладки рассмотрим в одной из следующих статей.
Команды скрипта по одной отображаются на экране; пользователь нажимает Enter; команда исполняется. Такое выполнение скрипта можно в любой момент прервать нажатием Ctrl+C. |
set Другие способы использовать команду set для отладки рассмотрим в одной из следующих статей.
В этом режиме команды скрипта со знаком ‘+’ впереди по одной отображаются на экране; после каждой команды отображается её вывод. Можно добавить Удобно комбинировать команды |
Полезные сочетания клавиш
Эти комбинации используются в пустой командной строке, то есть до ввода команд:
- ↑ (кнопка Вверх) — просмотр предыдущей команды. ↑ и ↓ — просмотр истории введённых команд.
Ctrl+R
— поиск в истории введённых команд. Нажмите это сочетание и начните набирать команду, которую хотите найти. Продолжайте нажиматьCtrl+R
, чтобы просматривать похожие команды в истории.Ctrl+Shift+R
(в режиме поиска по истории) — перемещение вперёд по истории ввода, то есть просмотр более поздних команд.
Во время ввода команды:
Tab
— автодополнение команд или аргумента.
Например, чтобы просмотреть, какие утилиты есть у пакетного менеджера apt
, напечатайте apt
и дважды нажмите Tab
. Отобразится список утилит:
Продолжайте печатать название нужной команды, например, apt-cl
, и нажмите Tab
. На этот раз отобразится единственное название — apt-clone
, так как с символов apt-cl
начинается только это название.
До или во время ввода команды:
Ctrl+L
— очистка экрана от предыдущих команд и выведенных результатов. Вводимая команда остаётся на экране. Можно просмотреть скрытые команды и вывод прокручиванием колёсика мыши.Ctrl+D
— выход из сессии текущего пользователя (аналогично командеexit
):- из сессии суперпользователя — в сессию непривилегированного (обычного) пользователя, под чьей учётной записью пользователь работал до этого;
- из сессии обычного пользователя — закрытие окна терминала.
Во время выполнения программы (эти сочетания срабатывают не во всех случаях):
Ctrl+Z
— приостановка работы приложения: процессы программы получают сигнал приостановкиSIGTSTP
(terminal stop), ожидают сигнала возобновленияSIGCONT
(continuation) и переходят в фоновый режим. В фоновом режиме процесс не может читать стандартный ввод — данные, вводимые пользователем в терминал с клавиатуры.Более подробно о потоках данных — стандартном вводе, стандартном выводе и стандартной ошибке — рассказываем в статье Bash-скрипты. Перенаправление ввода и вывода, об управлении заданиями — в статье Bash-скрипты. Управление заданиями, here-документы, конвейер.
- Все процессы, выполняемые в фоновом режиме, можно вывести из него командой
fg
. Ctrl+C
— завершение работы программы: процессы программы получают сигналSIGINT
, как и при выполнении командыkill
.
Общие рекомендации по созданию скриптов
Указывайте в строке c shebang (
#!/bin/bash
) корректный путь к нужному интерпретатору.Shebang — последовательность #!, с которой рекомендуется начинать скрипт. Она описана более подробно в предыдущей статье Знакомство с bash, в разделе Создание и запуск скрипта.
Старайтесь избегать команд и опций, применимых только в конкретной операционной системе. Если это невозможно, создавайте разные варианты скрипта для систем разных семейств, особенно если планируете разместить скрипт в публичном репозитории.
Например, для установки
pip
(системы управления пакетами Python) в наиболее популярных семействах Linux — Debian, CentOS/RHEL, Fedora и Arch — традиционно используются разные системы управления пакетами (пакетные менеджеры).Простой способ адаптировать скрипт для разных ОС — включить в него блоки команд установки для всех ОС с комментариями:
# Установка pip для Debian, Ubuntu и Mint sudo apt update sudo apt install python3-pip -y # Установка pip для CentOS, Fedora и RHEL sudo yum install epel-release sudo yum -y update sudo yum -y install python3-pip # Установка pip для Arch и Manjaro sudo pacman -Syu python3-pip # Установка pip для SUSE и OpenSUSE sudo zypper in python3-pip
Другой способ работы с разными ОС в скрипте — по названию операционной системы определить используемый пакетный менеджер:
install="" if [[ -f /etc/os-release ]]; then distro=$(grep -E '^ID=' /etc/os-release | cut -d'=' -f2 | tr -d '"') case "$distro" in ubuntu|debian|linuxmint) sudo apt update install="sudo apt install -y" ;; centos|fedora|rhel) sudo yum install epel-release sudo yum -y update install="sudo yum install -y" ;; arch|manjaro) install="sudo pacman -Syu" ;; opensuse|suse) install="sudo zypper in" ;; *) install="unknown" ;; esac else install="unknown" fi if [[ "$install" == "unknown" ]]; then echo "Известных пакетных менеджеров не найдено. Установите ПО вручную." else echo "Пакетный менеджер: $install" fi ${install} python3-pip
Инициализируется переменная
install
.Условный оператор
if
(расскажем о нём в одной из следующих статей) проверяет: если существует файл/etc/os-release
, то переменнойdistro
присваивается значение строки с названием дистрибутива ОС:grep -E '^ID=' /etc/os-release
вырезает из/etc/os-release
строкуID=
cut -d'=' -f2
вырезает название дистрибутива — слово после знака =tr -d '"'
удаляет кавычки, если они есть
В итоге переменная
install
получает значение названия ОС без кавычек — например, centos.Условный оператор
case
(о нём также расскажем в статье про условные операторы) проверяет:- если значение переменной
distro — ubuntu, debian
илиlinuxmint
:- обновляется список пакетов
apt
, стандартного пакетного менеджера для этого семейства дистрибутивов; - переменной
install
присваивается значение "установить при помощиapt
";
- обновляется список пакетов
- либо, если значение
distro — centos, fedora
илиrhel
:- обновляется список пакетов
yum
; - устанавливается дополнительный репозиторий EPEL, в котором находится пакет
pip
; - переменная
install
получает значение "установить при помощиyum
";
- обновляется список пакетов
- либо, если значение
distro — arch
илиmanjaro
, переменнаяinstall
получает значение "установить при помощиpacman
"; - либо, если значение
distro — suse
илиopensuse
, переменнаяinstall
получает значение "установить при помощиzypper
"; - если значение
distro
не найдено среди вышеуказанных, переменнойinstall
присваивается значениеunknown
. Если файл
/etc/os-release
не существует, то переменнойinstall
также присваивается значениеunknown
.
- если значение переменной
Условный оператор
if
проверяет: если переменнаяinstall
получила значениеunknown
, отображается сообщение:Известных пакетных менеджеров не найдено. Установите ПО вручную.
В остальных случаях отображается сообщение:
Пакетный менеджер: <название пакетного менеджера>
Пакет
python3-pip
устанавливается при помощи найденного пакетного менеджера.
- Рекомендуется записывать скрипты из нескольких команд в несколько строк, чтобы код было проще читать и поддерживать.
- Используйте единообразные (в рамках одного скрипта) отступы, чтобы улучшить его читаемость. Можно устанавливать их как при помощи пробела, так и клавишей Tab, в зависимости от ваших предпочтений, корпоративных стандартов или стандартов вашего сообщества разработчиков.
- Добавляйте краткие и понятные комментарии к смысловым блокам скрипта: это поможет и читателю, и самому автору позднее быстро разобраться в содержании и структуре кода.
- По возможности используйте в скриптах переменные вместо фиксированных значений (чисел, путей и т. д.): так скрипты проще изменять при необходимости. Выносите параметры конфигурации и константы в переменные или файлы конфигурации.
- Разделяйте скрипт на модули: выделяйте внутри скрипта отдельные функции или создавайте дополнительные скрипты, на которые можно ссылаться внутри основного. Это позволяет при необходимости изменять не весь скрипт целиком, а только его компоненты.
- Для каждого шага продумайте случаи, в которых он может быть не выполнен: например, если по указанному пути нет файла с указанным именем.
- Предусмотрите вывод однозначно трактуемых сообщений об ошибках, чтобы пользователю было ясно, как исправить ситуацию.
Проанализируйте, какие граничные значения (например, 0, отрицательные числа, очень длинные строки) действуют для скрипта и какие краевые случаи (например, отсутствие ввода, ввод недопустимых символов) могут возникнуть в ходе его работы. Проверьте корректность выводимых результатов для всех вариантов выполнения
Граничные значения (в тестировании ПО) — границы диапазонов входных данных. Цель тестирования на граничные значения — проверить работу программы с максимальными и минимальными значениями ввода, а также значениями, которые часто вызывают ошибки при выполнении программы.
Краевые случаи (в тестировании ПО) — нетипичные ситуации, которые могут произойти во время работы программы и вызвать ошибки при её выполнении. Краевые случаи не всегда связаны с границами диапазонов входных значений.
Заключение
В статье даны рекомендации по созданию скриптов на bash и рассмотрены основные команды Linux с примерами применения.