|
ОболочкиПервоначально опубликовано на сайте "Софтерра", www.softerra.ru Программы-оболочки.
Программы-оболочки.В той статье мы поговорим о
неотъемлемой части пользовательского интерфейса Linux – о
программах-оболочках. Именно программа-оболочка запускается
после регистрации пользователя в системе. Программы-оболочки
часто называют командными интерпретаторами, потому что они
обрабатывают (интерпретируют) команды, введенные
пользователем. Во времена DOS этим занимался файл
C:\command.com. root:x:0:0:root:/root:/bin/bash den:x:501:501:Denis:/home/den:/bin/bash Из листинга видно, что оба
пользователя используют оболочку /bin/bash. Оболочка, как
правило, указывается в последнем поле файла passwd. Листинг 1. /bin/sh /bin/bash /bin/ash /bin/bsh /bin/tcsh /bin/csh /bin/zsh На любой Unix-системе, даже
на самой старой, вы можете увидеть, по крайней мере, два
интерпретатора из этого списка: sh, csh. Названия, как вы
догадались, исходят от слова shell – оболочка. Csh – это
оболочка, использующая командный язык, напоминающий язык
программирования C. В ОС Linux по умолчанию используется
оболочка bash (Bourne Again Shell). Bash является более
«продвинутой» версией обыкновенной оболочки sh. $ program -s /etc/passwd Интерпретатор запустит
программу program и передаст ей два (точнее три)параметра:
первый – это -s, второй – это /etc/passwd. А что делать с
этими параметрами разберется сама программа. Я что-то говорит
о третьем параметре? Существует еще один так называемый
нулевой параметр. Этот параметр содержит полное имя файла
программы. Например, если наша программа находится в каталоге
/bin, то нулевой параметр будет содержать значение
/bin/program. Листинг 2. #!/bin/bash echo -n "Enter your name" read name echo "Hello, $name" Для определенности скажем,
что мы сохранили этот сценарий под именем script1. Чтобы мы
могли выполнить этот сценарий нужно сделать этот файл
исполнимым (например, с помощью команды chmod 550 ./script1) и
ввести команду (я предполагаю, что вы создали этот файл в
текущем каталоге): При запуске сценария программа-оболочка определяет, какую программу нужно запустить для обработки этого сценария. После этого интерпретатор запускает нужную программу и передает ей имя файла сценария в качестве параметра. В нашем случае интерпретатор выполнит команду (первая строка листинга 2): /bin/bash ./script1 При этом не имеет значения, какой интерпретатор сейчас активен: будет запущена программа, указанная в первой строке сценария. Вы можете указать также и опции программы-оболочки: #!/usr/bin/myshell -option При запуске сценария, в
первой строке которого стоит такая команда, интерпретатор
выполнит команду: Обратите внимание на первую
строку сценария script1 Интерпретатор bashВ этой статье я рассмотрю оболочку bash, которая стандартна для большинства систем. Однако сам командный язык подробно разобран не будет из-за его объемности. Итак, начнем по порядку с регистрации пользователя. Как я уже отмечал, после успешной аутентификации пользователя, запускается программа-оболочка (в нашем случае это /bin/bash). При запуске оболочки выполняются некоторые действия. Эти действия определены в файле ~/.bash_profile (см. листинг 3). Листинг 3. # .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then ~/.bashrc fi # User specific environment and startup programs PATH=$PATH:$HOME/bin BASH_ENV=$HOME/.bashrc USERNAME="user" HISTIGNORE=" [ ]*:&:bg:fg" export USERNAME BASH_ENV PATH HISTIGNORE clear Файл .bash_profile представляет собой обыкновенный сценарий. Теперь разберемся, какие действия выполняет этот сценарий. В этом файле определяются переменные окружения и программы, которые должны запускаться автоматически. В листинге 3 сначала проверяется существование файла .bashrc и, если он существует, интерпретатор выполняет его. Файл .bashrc рассмотрим немного позже. Затем устанавливаются переменные окружения: PATH, BASH_ENV, USERNAME, HISTIGNORE. Первая задает путь для поиска программ, вторая определяет среду интерпретатора (файл .bashrc), третья устанавливает имя пользователя, а последняя относится к истории команд, введенных пользователем. Затем переменные экспортируются. Дело в том, что переменные локальны в рамках сценария. При экспорте переменных их значение будет доступно порожденным процессам. Например, создайте такие два сценария (см. листинги 4 и 5). Листинг 4. #!/bin/bash MYVAR="My var" export MYVAR ./listing5 Листинг 5 #!/bin/bash echo "$MYVAR" Запустите сценарий
./listing4. Он экспортирует переменную MYVAR и запустит
сценарий listing5, которые выведет значение переменной MYVAR
(«My var») на экран. Теперь закомментируйте строку: Листинг 6 Здесь задаются определенные
установки. В основном данные установки необходимы для удобства
пользователя. Например, определяются псевдонимы команд
(alias). Командный язык bash. Переменные.Обязательным атрибутом
переменной в любом языке программирования является тип
значения переменной. В командном языке bash все переменные
текстовые. Например, если вы присваиваете переменной значение
A=23, то значением переменной будет строка из двух сиволов –
«23». NAME=Ivan Если нужно присвоить значение, содержащее пробелы, нужно использовать кавычки: NAME="Ivan Ivanov" Обращение к значению переменной выполняется с помощью знака доллара перед именем переменной: echo "NAME" Первая команда выведет на экран слово NAME, а вторая – значение переменной NAME (Ivan Ivanov). Если значение переменной может содержать пробелы, имя переменной нужно заключить в кавычки. Например, NAME="Ivan Ivanov" Первая команда echo выведет
на экран слово Ivan, а вторая – Ivan Ivanov. Массивы.Оболочка bash поддерживает
одномерные массивы с неограниченным числом элементов. В других
интерпретаторах существуют определенные ограничение на
массивы, например, в ksh максимальное число элементов массива
ограничено 1024-мя элементами. Имя_массива[индекс]=значение Например Array[1]=23 Нумерация элементов
начинается с ноля. Тип элементов массива, как и тип
переменных, текстовый. set –A array 3 56 77 12 Аналогично выражениям array[0]=3 Обратиться ко всем элементам
массива сразу можно так: Специальные переменные.Каждому процессу доступны переменные оболочки, приведенные в таблице 1. Таблица 1
Кроме этих переменных
устанавливаются и другие переменные, назначение которых вы
можете узнать в документации по bash. Таблица 2.
Арифметические выраженияПодстановка арифметических выражений осуществляется с помощью конструкции $(( выражение )) Например, N = $(( (10+5)/2 )) На экране вы увидите 3, а не
3,5, потому что интерпретатор bash использует целочисленные
вычисления. Подстановка переменных. Подстановка значений.Интерпретатор bash предоставляет нам довольно гибкий механизм подстановки переменных. При этом переменная будет использоваться не всегда, а в зависимости от определенных обстоятельств. (см. таблицу 3). Таблица 3.
(*) Реальное значение
переменной не изменяется. При подстановке команд нужно использовать обратные одинарные кавычки (они расположены под символом тильды на клавиатуре). Подставлять можно не только одну команду, а целые списки команд: USERS=‘who | wd –l‘
В первом случае мы получим
количество пользователей работающих в системе, а во втором
последовательно записанные результаты выполнения команд date и
uptime. В третьем случае мы просто получим логин пользователя,
под которым мы сейчас работаем в системе. grep ‘id –un‘ /etc/passwd
Управляющие структуры.К управляющим структурам
относятся: Общий синтаксис конструкции if-fi if список1 then
Конструкция if-fi работает
так же, как и в других языках программирования.Если список1
(условие) истинный, выполняется список2, иначе выполняется
список3 и проверяется его истинность и т.д. Допускается
неограниченная вложенность операторов if.
Символ "!" является символом
логической операции NOT (отрицание). Кроме этого символа,
можно использовать опции команды -o и –a, которые обозначают
логические операции ИЛИ (OR) и И (AND). test –e /etc.passwd Cинтаксис блока выбора (case – выбор): case значение in
Работает этот блок почти
также, как в языке С. Однако есть небольшая разница: если
найдено совпадение с каким-нибудь шаблоном (например,
шаблонN-2) и выполнен соответствующий список команд списокN-2,
осуществляется выход из блока. В языке С для достижения этого
эффекта нужно было использовать оператор break, иначе
выполнялись вы все списки после спискаN-2: списокN-1, списокN.
Циклы.Интерпретатор bash
поддерживает циклы for, while, until, select, а интерпретатор
sh только for и while. Синтаксис цикла for: for имя_переменной in
список1 Простой пример: for i in 1 2 3 4 5; do echo $i; done На экране вы увидите for str in ‘cat ./file.txt‘
Цикл for закончит свою работу, когда будет обработан последний элемент списка, в данном случае, когда на экран будет выведена последняя строка файла file.txt Синтаксис цикла while: while список1 Цикл while будет выполняться, пока условие, заданное в списке список1, будет истинным. Поэтому цикл while иногда называют циклом с истинным условием. Например, a=1 На экране вы увидите: ПодоболочкиРассмотрим два почти аналогичных сценария #!/bin/bash
# Сценарий 1
NUM=”one”; (NUM=”two”; echo $NUM;);
echo $NUM
#!/bin/bash
# Сценарий 2
NUM=”one”; {NUM=”two”; echo $NUM;};
echo $NUM
Сценарий 1 выведет на экран следующую информацию: two А сценарий 2 two Если список команд заключен в фигурные скобки, то он выполняется в текущей оболочке, а если в круглые – то в подоболочке. Механизм подоболочек, как вы уже успели догадаться, связан с областью действия переменных. Как и в любом другом языке программирования, в bash существуют два типа переменных: глобальный и локальные. Поскольку переменные в bash не описываются в начале программы, как в других языках, например, Pascal, внутри блока можно использовать как глобальные переменные (описанные в основном блоке сценария), так и локальные (описанные в этом блоке, при условии, что этот блок является подоболочкой). В этой статье я попытался объять необъятное, поэтому совсем не удивительно, что некоторые возможности bash (функции, циклы until и select, протоколирование, обработка сигналов…) не рассмотрены, а некоторые рассмотрены не очень подробно (команда test). Возможно, эти возможности я рассмотрю в своих последующих статьях. А сейчас могу предложить вам список ссылок, посвященных bash, shell, а также Unix-системам вообще: http://dkws.narod.ru/linux/books_.html Copyright © "Софтерра", http://www.softerra.ru/, inform@softerra.ru
|
|
Copyright © Soft&Script. Все материалы являются собственностью их авторов. При перепечатывании ссылка на http://www.arki.ru/magaz/ как на источник информации обязательна. Правила использования материалов журнала |