Библиотека Интернет Индустрии I2R.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 # .bashrc # User specific aliases and functions alias rm='rm -i' alias mv='mv -i' alias cp='cp -i' alias s='cd ..' alias d='ls' alias p='cd -' # Need for a xterm & co if we don't make a -ls [ -n $DISPLAY ] && { [ -f /etc/profile.d/color_ls.sh ] && source /etc/profile.d/color_ls.sh export XAUTHORITY=$HOME/.Xauthority } # Read first /etc/inputrc if the variable is not defined, and after the /etc/inputrc # include the ~/.inputrc [ -z $INPUTRC ] && export INPUTRC=/etc/inputrc # Source global definitions if [ -f /etc/bashrc ]; then . /etc/bashrc fi Здесь задаются определенные установки. В
основном данные установки необходимы для удобства пользователя. Например,
определяются псевдонимы команд (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 |
|
2000-2008 г. Все авторские права соблюдены. |
|