<Предыдущая | Содержание: | Следующая>
При желании подсказки могут выполнять сценарии оболочки и вести себя по-разному в разных условиях. Вы даже можете заставить подсказку проигрывать мелодию каждый раз, когда вы вводите команду, хотя это довольно скоро наскучит. Более подробную информацию можно найти в Bash-Prompt HOWTO.
7.2.5. Скрипты оболочки
7.2.5.1. Что такое скрипты?
Сценарий оболочки, как мы видели в примерах конфигурации оболочки, представляет собой текстовый файл, содержащий команды оболочки. Когда такой файл используется в качестве первого аргумента без параметров при вызове Bash, и ни один из -c ни -s задана опция, Bash читает и выполняет команды из файла, а затем завершает работу. Этот режим работы создает
неинтерактивная оболочка. Когда Bash запускает сценарий оболочки, он устанавливает специальный параметр 0 к имени файла, а не к имени оболочки, а позиционные параметры (все, что следует за именем сценария) устанавливаются на оставшиеся аргументы, если таковые имеются. Если дополнительные аргументы не указаны, позиционные параметры не устанавливаются.
Сценарий оболочки можно сделать исполняемым с помощью CHMOD команда, чтобы включить бит выполнения. Когда Bash находит такой файл при поиске в PATH для команды он порождает вспомогательную оболочку для ее выполнения. Другими словами, выполнение
имя файла АРГУМЕНТЫ
эквивалентно выполнению
колотить имя файла АРГУМЕНТЫ
если «имя файла» - это исполняемый сценарий оболочки. Эта суб-оболочка повторно инициализируется, так что эффект такой, как если бы новая оболочка была вызвана для интерпретации сценария, за исключением того, что расположение команд запомнилось родителем (см. хэш на информационных страницах) остаются за дочерним элементом.
Большинство версий UNIX делают это частью механизма выполнения команд операционной системы. Если первая строка сценария начинается с двух символов «#!», Оставшаяся часть строки определяет интерпретатор для программы. Таким образом, вы можете указать колотить, AWK, Perl или какой-либо другой интерпретатор или оболочку и напишите остальную часть файла сценария на этом языке.
Аргументы интерпретатора состоят из одного необязательного аргумента, следующего за именем интерпретатора в первой строке файла сценария, за которым следует имя файла сценария, за которым следуют остальные аргументы. Bash выполнит это действие в операционных системах, которые не справляются с этим сами.
Скрипты Bash часто начинаются с
#! / bin / bash (при условии, что Bash установлен в / бен), поскольку это гарантирует, что Bash будет использоваться для интерпретации скрипта, даже если он выполняется под другой оболочкой.
7.2.5.2. Несколько простых примеров
Очень простой скрипт, состоящий всего из одной команды, передающей привет пользователю, выполняющему его:
[Джерри @ нигде ~] кот hello.sh
#! / Bin / Баш
echo "Привет, $ USER"
[Джерри @ нигде ~] кот hello.sh
#! / Bin / Баш
echo "Привет, $ USER"
Сценарий фактически состоит только из одной команды, эхо, который использует Значение ($) USER переменная среды для печати строки, настроенной для пользователя, вводящего команду.
Еще один однострочник, используемый для отображения подключенных пользователей:
#! / Bin / Баш
кто | вырезать -d "" -f 1 | sort -u
#! / Bin / Баш
кто | вырезать -d "" -f 1 | sort -u
Вот сценарий, состоящий из еще нескольких строк, которые я использую для создания резервных копий всех файлов в каталоге. Сначала скрипт составляет список всех файлов в текущем каталоге и помещает его в переменную СПИСОК. Затем он устанавливает имя копии для каждого файла, а затем копирует файл. Для каждого файла печатается сообщение:
tille: ~> кот бен / makebackupfiles.sh
#! / Bin / Баш
# делаем копии всех файлов в каталоге LIST = `ls`
для i в $ LIST; делать
ORIG = $ i
DEST = $ i.old
cp $ ORIG $ DEST echo "скопировано $ i"
сделанный
tille: ~> кот бен / makebackupfiles.sh
#! / Bin / Баш
# делаем копии всех файлов в каталоге LIST = `ls`
для i в $ LIST; делать
ORIG = $ i
DEST = $ i.old
cp $ ORIG $ DEST echo "скопировано $ i"
сделанный
Просто введите строку вроде mv * *.Старый не будет работать, как вы заметите, попробовав это на наборе тестовых файлов. An эхо была добавлена команда для отображения некоторой активности. эхо's обычно полезны, когда сценарий не работает: вставляйте по одному после каждого сомнительного шага, и вы обнаружите ошибку в кратчайшие сроки.
Команда /etc/rc.d/init.d каталог содержит множество примеров. Давайте посмотрим на этот скрипт, который управляет фиктивным сервером ICanSeeYou:
#! / Bin / ш
# description: ICanSeeYou позволяет видеть людей, подключенных к сети.
# имя процесса: ICanSeeYou
# pidfile: /var/run/ICanSeeYou/ICanSeeYou.pid
# конфигурация: /etc/ICanSeeYou.cfg
# Библиотека исходных функций.
. /etc/rc.d/init.d/функции
# Посмотрите, как (с какими аргументами) нас позвали. case "$ 1" в
начало)
echo -n "Запуск ICanSeeYou:" демон ICanSeeYou
эхо
сенсорный / var / lock / subsys / ICanSeeYou
;;
остановка)
echo -n "Завершение работы ICanSeeYou:"
#! / Bin / ш
# description: ICanSeeYou позволяет видеть людей, подключенных к сети.
# имя процесса: ICanSeeYou
# pidfile: /var/run/ICanSeeYou/ICanSeeYou.pid
# конфигурация: /etc/ICanSeeYou.cfg
# Библиотека исходных функций.
. /etc/rc.d/init.d/функции
# Посмотрите, как (с какими аргументами) нас позвали. case "$ 1" в
начало)
echo -n "Запуск ICanSeeYou:" демон ICanSeeYou
эхо
сенсорный / var / lock / subsys / ICanSeeYou
;;
остановка)
echo -n "Завершение работы ICanSeeYou:"
killproc ICanSeeYou эхо
rm -f / var / lock / subsys / ICanSeeYou
rm -f /var/run/ICanSeeYou/ICanSeeYou.pid
;;
положение дел)
статус ICanSeeYou
;;
перезапуск)
$ 0 stop
$ 0 start
;;
*)
echo "Использование: $ 0 {start | stop | restart | status}", выход 1
ESAC
выйти из 0
killproc ICanSeeYou эхо
rm -f / var / lock / subsys / ICanSeeYou
rm -f /var/run/ICanSeeYou/ICanSeeYou.pid
;;
положение дел)
статус ICanSeeYou
;;
перезапуск)
$ 0 stop
$ 0 start
;;
*)
echo "Использование: $ 0 {start | stop | restart | status}", выход 1
ESAC
выйти из 0
Во-первых, с . команда (точка) набор функций оболочки, используемых почти во всех сценариях оболочки в
/etc/rc.d/init.d, загружен. Потом , признали выдается команда, которая определяет 4 различных способа выполнения сценария. Примером может быть Я тебя вижу Начало. Решение о том, какой случай применить, принимается путем чтения (первого) аргумента сценария с выражением $1.
Если соответствующий ввод не задан, применяется регистр по умолчанию, отмеченный звездочкой, после чего сценарий выдает сообщение об ошибке. В , признали список заканчивается ESAC утверждение. в Начало если серверная программа запускается как демон, и назначаются идентификатор процесса и блокировка. в остановить В этом случае серверный процесс отслеживается и останавливается, а блокировка и PID удаляются. Параметры, такие как демон вариант и такие функции, как убитьпрок, определены в /etc/rc.d/init.d/функции файл. Эта настройка специфична для дистрибутива, используемого в этом примере. Скрипты инициализации в вашей системе могут использовать другие функции, определенные в других файлах, или вообще не использовать.
В случае успеха скрипт возвращает своему родителю нулевой код выхода.
Этот сценарий является прекрасным примером использования функций, которые упрощают чтение сценария и ускоряют работу. Обратите внимание, что они используют sh вместо колотить, чтобы сделать их полезными в более широком диапазоне систем. В системе Linux вызов колотить as sh приводит к тому, что оболочка работает в POSIX-совместимом режиме.