Перейти к содержанию

14.1 Работа со сценариями оболочки (Working with Shell Scripts)

Чтобы понять, как работают сценарии оболочки (shell scripts), необходимо знать следующее:

  • Составные части сценария оболочки
  • Как выполняются сценарии оболочки

Начнём с обсуждения составных частей сценария оболочки.


Составные части сценария оболочки (The Components of a Shell Script)

Как уже упоминалось, сценарий оболочки (shell script) — это обычный текстовый файл, содержащий последовательность команд, которые выполняются сверху вниз. Ниже приведён пример сценария оболочки с именем runme:

#!/bin/bash
#A simple script that displays the current date and time
echo "The current date and time is:"
date
exit 0

Обратите внимание, что этот сценарий состоит из нескольких частей:

  • #!/bin/bash — Первая строка любого сценария оболочки должна указывать, в какой оболочке сценарий предназначен для выполнения. В данном случае указана оболочка /bin/bash. При запуске сценария будет создана субоболочка (subshell) с использованием указанной здесь оболочки, и содержимое сценария будет обработано внутри неё.

  • #A simple script that . . . — Эта часть сценария является комментарием, описывающим его назначение. Обратите внимание, что данная часть сценария начинается с символа #, который указывает на то, что следующий за ним текст является комментарием. Поскольку это комментарий, данная часть сценария не отображается на экране при его запуске. Комментарии необязательны. Сценарий отлично выполнится и без них. Тем не менее хорошей практикой считается включение комментария в начало сценария сразу после объявления оболочки — такой комментарий описывает назначение сценария и, по желанию, указывает автора.

  • echo, date — Эти элементы сценария представляют собой простые команды, обычно используемые в приглашении командной строки. Команда echo используется для вывода текста на экран. Команда date используется для отображения на экране текущих даты и времени.

  • exit 0 — Эта часть сценария является его завершением. Она сообщает оболочке, что делать после выполнения всех команд сценария. В данном случае она указывает оболочке завершить выполнение сценария.

При запуске этого сценария на экране отображается вывод, показанный на рис. 14-1. Обратите внимание, что сценарий сначала вывел текст, заданный командой echo. Затем была обработана следующая команда, которая направила оболочку на выполнение команды date. По завершении сценария оболочка вышла из него и вернула нас к приглашению командной строки.

Рис. 14-1. Запуск простого сценария оболочки.

Рис. 14-1. Запуск простого сценария оболочки.


Выполнение сценариев оболочки (How Shell Scripts Are Executed)

Как видно из рис. 14-1, для запуска сценария пришлось вызвать оболочку (/bin/bash), а затем указать, какой сценарий выполнить (./runme). Это один из способов запуска сценария. Однако существует и второй способ (на мой взгляд, более предпочтительный). Вспомните раздел, в котором мы рассматривали права доступа. Одним из прав доступа к файлу является право на выполнение (execute). Если файлу назначено право на выполнение, любой файл, включая текстовый, может быть запущен из приглашения командной строки. Это отличный способ обеспечить удобство запуска сценариев для конечных пользователей.

Для этого достаточно включить атрибут выполнения для владельца (Owner), группы (Group) и/или остальных (Others). Как вы уже знаете, это делается с помощью команды chmod. В рассматриваемом примере можно настроить файл runme на выполнение его владельцем, введя в приглашении командной строки chmod u+x runme. После этого сценарий runme можно запустить, просто введя его имя в приглашении командной строки — точно так же, как и любую другую системную команду. Это показано в следующем примере:

rtracy@openSUSE:~> chmod u+x runme
rtracy@openSUSE:~> ls -l runme
-rwxr--r-- 1 rtracy users 118 Dec 11 10:50 runme
rtracy@openSUSE:~> ./runme
The current date and time is:
Thu Dec 11 11:07:08 MST 2014

При необходимости можно также предоставить право выполнения группе и/или остальным.

Есть ещё один аспект, который необходимо учитывать при работе со сценариями, — это вопрос путей. Обратите внимание, что в предыдущем примере потребовалось ввести ./runme в приглашении командной строки. Несмотря на то что файл находился в текущем каталоге (в данном случае /home/rtracy), этот каталог не включён в переменную окружения $PATH.

Если вы создаёте сценарии для себя, это, скорее всего, не представляет проблемы. К этому моменту вы уже достаточно хорошо знакомы с Linux и понимаете, почему необходимо указывать путь к файлу в приглашении командной строки, и знаете, как это делается. Однако если вы создаёте сценарий для конечных пользователей, это может стать проблемой. Чтобы избежать лишних затруднений, следует рассмотреть возможность размещения сценария в каталоге, входящем в состав переменной PATH, или добавления соответствующего каталога в существующую PATH.

Один из вариантов — использовать каталог ~/bin в домашнем каталоге каждого пользователя. Большинство дистрибутивов Linux автоматически создают каталог /bin для каждого пользователя. Затем один из файлов конфигурации оболочки bash, рассмотренных в предыдущей главе, используется для автоматического добавления ~/bin в переменную окружения PATH при запуске оболочки. Это показано ниже:

rtracy@openSUSE:~> echo $PATH
/usr/lib/mpi/gcc/openmpi/bin:/home/rtracy/bin:/usr/local/bin:/usr/bin:
/bin:/usr/bin/X11:/usr/X11R6/bin:/usr/games

Поскольку этот каталог входит в PATH, любые файлы, помещённые в ~/bin, можно запускать из приглашения командной строки без указания полного пути к файлу. Разумеется, можно также создать собственный каталог и вручную отредактировать файлы конфигурации оболочки bash, добавив его в переменную окружения PATH пользователя.

Имея это в виду, перейдём к обсуждению создания базового сценария оболочки.