Взаимодействие пользователя с операционной системой возможно лишь при наличии соответствующего интерфейса. Для Windows чаще всего используется графический интерфейс, для Linux-подобных систем – интерфейс командной строки, наличие которого обеспечивают, так называемые Shell-оболочки. Одной из таких оболочек является Bash (Bourne again shell), которая обеспечивает возможность управления Linux-системой с помощью команд. Однако для её эффективного использования необходимо иметь представление о её возможностях и правилах применения в том или ином случае. Разберём детальнее эти вопросы.
Характеристики Bash
Программа является интерпретатором командного языка, способным выполнять команды, поступающие из стандартного ввода (режим командной строки) или файла (режим сценария). Здесь реализован императивный способ обработки команд, при котором идёт последовательное их выполнение по мере поступления на вход интерпретатора. Это сближает Bash с популярными языками программирования, такими как C, Python и Java, из которых были взяты основные принципы программирования и организации программ, в частности, это касается структурного разбиения сценариев на независимые части.
Bash отвечает требованиям спецификации IEEE POSIX, поэтому, является POSIX-совместимым программным средством.
Bash полностью совместима с оболочкой sh (Bourne Shell), являющейся устаревшим стандартом для всех Unix-подобных систем. Она также имеет много общего с оболочками csh (C-Shell) и ksh (Korn- Shell), что облегчает одновременное использование указанных программ на одной машине.
Как и в любом командном процессоре, в Bash предусмотрено наличие двух видов команд – внутренних и внешних. Первые постоянно находятся в оперативной памяти (ОП) машины и, соответственно, выполняются быстрее. К ним, например, относятся команды смены каталога (cd), вывода содержимого переменной на экран (echo) и др. Внешние команды способны реализовать более мощные возможности интерпретатора, но требуют большего времени выполнения из-за большего объёма и необходимости загрузки в ОП при каждом вызове.
При своей работе, как и любой из языков структурного программирования, оболочка использует ряд переменных, одни из которых являются внутренними, другие внешними. Во внутренних переменных Bash хранит значения параметров программной среды окружения, которые, в частности, необходимы для работы запускаемых программ и самой оболочки, а также получения системной информации.
Приведём некоторые из внутренних переменных:
- $HOME – содержит полное название домашнего каталога текущего пользователя;
- $PWD – содержит информацию от текущей директории;
- $BASH_VERSION – хранит версию текущего командного процессора;
- $HOSTTYPE – хранится аппаратная конфигурация текущей машины;
- $PATH – хранит информацию о месте нахождения исполнимых файлов программы.
Внешние переменные определяются пользователем и обычно необходимы для хранения и вывода промежуточных и конечных результатов выполнения команд, как в обычном режиме, так и при выполнении сценариев. При их создании необходимо придерживаться определённых правил:
- имя может начинаться с символа подчёркивания или буквы;
- в их названии могут присутствовать цифры, буквы или символы подчёркивания;
- при написании имени нужно учитывать регистр символов;
- запрещено использовать специальные символы и зарезервированные системой слова.
Ниже нами будут рассмотрены приёмы работы с оболочкой в двух режимах: одиночных команд и в режиме обработки сценариев.
Работа в режиме одиночных команд
Такой режим является базовым, так как позволяет пользователю вести интерактивный «диалог» с командным процессором посредством вводимых с терминала команд. Это даёт возможность пользователю получить практически любую информацию или выполнить нужное действие. Например, это может быть следующий набор активностей:
- Узнать тип установленной оболочки и её версию;
- Получить полное название текущей директории;
- Сменить каталог или создать новый;
- Создать новый файл или отредактировать имеющийся;
- Получить полную информацию о программной среде окружения;
Реализуем на практике уже перечисленные и некоторые другие запросы к bash.
Использование внутренних команд и переменных
Для начала, просмотрим список оболочек, зарегистрированных в системе. Для этого наберём следующую команду в терминале:
$ cat /etc/shells
Как видим, командных процессоров может быть множество, каждый из которых может использоваться для определённых целей и, поэтому, бывает необходимым узнать, какой из них текущий. Для этого может быть использована следующая команда:
$ echo $SHELL
Можно убедиться, что текущей оболочкой на данный момент является bash.
Попробуем узнать её версию с помощью соответствующей внутренней переменной:
$ echo $BASH_VERSION
Установленная версия – 5.1.16, которая является самой новой.
Для того, чтобы сменить текущую оболочку на любую другую из уже зарегистрированных, можно использовать следующий формат команды:
$ chsh –s «имя и местонахождение оболочки» «логин пользователя, для которого устанавливается»
К примеру, в случае установки интерпретатора sh для пользователя root указанная конструкция будет выглядеть следующим образом:
$ chsh -s /usr/bin/sh root
Само собой, оболочка не сменится мгновенно, а лишь после выхода из системы и прохождения указанным в команде пользователем повторной авторизации. Признаком того, что вы работаете с другим командным процессором, будет изменённый формат приглашения командной строки. Так, для bash формат приглашения будет следующим:
Логин текущего пользователя@имя узла:текущий каталог Символ приглашения($ или #)
В нашем случае выводятся следующие данные:
Root – логин текущего пользователя;
Dedicated – имя узла;
~ – текущий каталог (домашний каталог пользователя);
# – символ приглашения, обозначающий принадлежность пользователя к категории суперпользователей.
Чтобы узнать домашний каталог текущего пользователя, который, как мы уже видели, часто обозначается знаком тильды, можно воспользоваться информацией, содержащейся в одной из внутренних переменных. Просмотрим эту информацию:
$ echo $HOME
Как видим, это каталог /root, который находится в корне файловой системы.
Сменим каталог на корневой и увидим как изменится строка приглашения:
$ cd ..
Можно убедиться, что вместо знака тильды, в приглашении командной строки появился признак корневого каталога (/), как и должно быть. Теперь с помощью конструкции ls просмотрим его содержимое:
Здесь мы можем увидеть домашний каталог пользователя root.
Теперь вернёмся обратно:
$ cd root
Как видим, знак тильды снова появился в приглашении, что говорит о том, что мы опять находимся в домашнем каталоге текущего пользователя.
Часто бывает необходимым получить полную информацию о программной среде окружения, большая часть которой хранится, как мы уже знаем, во внутренних переменных. Для этого можно воспользоваться следующим средством:
$ printenv
В результате, мы получили полную информацию о конфигурации программного окружения, что, в частности, даёт возможность выполнять корректные установку и настройку стороннего программного обеспечения, а также использовать эту информацию для оптимизации работы самой системы.
В системе используется несколько десятков внутренних команд, которые тяжело запомнить. Поэтому, для их просмотра всегда можно воспользоваться внутренним справочником. Сделаем это:
$ help
Как видно из выведенных результатов, многие команды имеют дополнительные аргументы, которые всегда можно здесь просмотреть, не запоминая их специально, что очень удобно.
Команды работы с файлами
Для создания или просмотра файлов в системе присутствует ряд встроенных редакторов, основные из которых nano и vim.
Воспользуемся одним из них для создания файла:
$ nano new_file1
В открывшемся окне добавим следующую строчку: «Це перший створений нами файл у системі Ubuntu». Результат показан ниже.
Для сохранения внесённых в файл изменений нажмём клавиши ctrl+O, затем Enter. Для выхода из редактора воспользуемся клавишами ctrl+X.
Для просмотра содержимого созданного файла можно снова вызвать редактор или же воспользоваться следующим средством:
$ cat new_file1
Как видим, информация выводится непосредственно на консоль. Это бывает удобно в случае незначительно объёма информации.
Кроме того, есть возможность создания пустого файла, не запуская редактор. Это можно сделать следующим образом:
$ touch new_file2
Также для этих же целей можно воспользоваться следующей командой:
$ echo > new_file2
Если же в файл нужно добавить незначительное количество информации, тогда предыдущая конструкция преобразуется следующим образом:
$ echo "Це перший створений нами файл у системі Ubuntu" > new_file2
Просмотрим его содержимое:
$ cat new_file2
Как видим, это вполне адекватно работает и даже принимает кириллические символы.
Существует ещё немало средств и способов создания файлов в среде bash, однако для их детального рассмотрения потребовалось бы несколько статей. Тем более, что наша основная задача – показать базовые направления использования средств bash, что мы и делаем.
Использование сценариев
Как уже говорилось, сценарии, наряду со стандартным вводом, являются ещё одним способом формирования команд для оболочки, а, по сути, управления ядром операционной системы. Однако, в отличие от первого способа, сценарии позволяют организовать поток команд, который будет выполняться в автоматическом режиме в нужное время без участия пользователя. И, поэтому, имеют несомненное преимущество перед одиночным вводом команд.
Принцип формирования сценария очень прост. Создаётся файл, в который последовательно вводятся конструкции языка bash, которые могут быть сколь угодно сложными в зависимости от задачи, которую он решает. Затем файл сохраняется с расширением .sh.
Для примера, создадим сценарий, в котором будет использоваться внешняя переменная под названием ball, необходимая для сохранения промежуточных и конечных результатов работы нашего сценария.
Нам нужно создать файл сценария и ввести в него следующие строки кода:
#!/bin/bash
echo "Скільки Ви отримали балів на вступних іспитах до Сільськогосподарської Академії?"
read ball
echo "Зрозуміло, значить Ви отримали $ball балів, я так і подумав"
Поясним назначение всех используемых в коде символов и команд.
Первая строчка является обязательной. Символы #! указывают интерпретатору на то, что файл исполняемый, а не просто текст. Следующие символы в этой же строчке (/bin/bash) указывают на местонахождение и название командного процессора, который должен запускать сценарий.
После этого идёт список команд, которые и составляют тело сценария. В частности, команда read призвана «читать» значения, введённые пользователем с терминала. Введённые значения затем передаются внешним переменным, как, например, ball в нашем случае. Команда echo, как мы уже знаем, выводит на экран значения переменных.
Теперь запустим редактор nano и вставим во вновь созданный файл сценария new_script.sh приведённый выше код:
$ nano new_script.sh
Сохраним внесённые изменения и закроем файл (ctrl+X).
Для запуска сценария в ручном режиме из командной строки используется два способа.
Первый способ запуска. Здесь необходимо использование конструкции bash, иначе сценарий не запустится:
$ bash new_script.sh
Результат представлен выше. Вначале оболочка выводит первый вопрос и ждёт, пока пользователь введёт какое-либо значение. После того, как значение введено, сценарий продолжает работу и в конечном счёте выводит результат, что мы и продемонстрировали.
Второй способ запуска. В этом случае, необходимо сделать файл сценария исполнимым, а затем запустить с использованием специальной конструкции «./»:
$ chmod +x new_script.sh
Запустим его:
$ ./new_script.sh
Можно убедиться, что результат выполнения сценария идентичен результату предыдущего способа.
Для автоматического запуска сценариев в нужный момент времени можно использовать ряд конфигурационных файлов, а также планировщик. Но это выходит за рамки этой статьи.