Сигналы, вызывающие прерывание выполнения команды,
перечислены в табл.1.

В зависимости от своего режима работы, при получении
сигнала интерпретатор поступает следующим образом. Если
режим работы - интерактивный, то (также как и при обнаруже-
нии ошибки) завершив выполнение текущей команды, он перейдет
к выполнению следующей. Если же режим - неинтерактивный,
интерпретатор завершит выполнение текущей команды, после
чего либо прекратит работу, либо возвратится в интерактивный
режим.

Таблица 1

Сигналы системы ДЕМОС

------------------------------------------------------------
Сигнал Описание
------------------------------------------------------------
0 выход из интерпретатора (по любой причине, включая
достижение конца файла)
1 зависание
2 прерывание
3* выход (CTRL/Q создается файл core, содержащий копию
оперативной памяти процесса)
4* запрещенная команда (не сбрасывается после приема)
5* использование команды BPT (прерывание трассировки)
6* использование команды прерывания ввода/вывода IOT
7* использование команды EMT
8* ошибка операции с плавающей точкой
9 уничтожить процесс (не может быть перехвачен или про-
игнорирован)
10* ошибка шины
11* нарушение защиты памяти
12* неправильный параметр в системном вызове
13 запись по каналу межпроцессной связи при отсутствии
чтения процессом-получателем
14 прерывание по заданному времени
15 прерывание программы (по команде kill)
16 не используется
------------------------------------------------------------

Команды, отмеченные знаком *, осуществляют копирование
оперативной памяти процесса. Однако, сам интерпретатор игно-
рирует эти сигналы.


- 32 -










При поступлении сигнала прерывания выполняются некото-
рые стандартные действия, после чего обрабока командного
файла обычно завершается. Если это по тем или иным причинам
не устраивает пользователя, он может задать свои методы
реакции на определенные типы прерываний. Для этой цели в
языке SHELL применяется встроенная команда trap. Например,
команда

trap 'rm /tmp/ps$$; exit' 2

перехватывает сигнал 2 (прерывание) и выполняет команду

rm /tmp/ps$$; exit

Встроенная команда exit прерывает выполнение командного
файла.

Существует три способа обработки сигналов:

1. Сигналы игнорируются (в этом случае сигнал вообще не
посылается процессу).

2. Сигналы перехватываются (реакция на сигнал обеспечивается
самим процессом).

3. Сигналы пропускаются без обработки. Работа процесса
завершается.

Если при входе в командный файл сигнал игнорируется, то
игнорируется и команда trap.

Если аргументом команды trap является пустая строка, то
процедура игнорирует сигналы. В качестве примера можно при-
вести фрагмент команды nohup:

trap '' 1 2 3 15

после выполнения которого как процедура, так и вызывающие ее
команды будут игнорировать перечисленные сигналы.

Стандартная реакция на сигналы может быть восстанов-
лена, например, следующей командой:

trap 2 3

Список текущих значений сигналов системы может быть получен
с помощью команды

trap


Еще одним примером использования команды trap (без пос-
ледующего выхода из командного файла) является процедура


- 33 -










scan, которая осуществляет просмотр подсправочников в теку-
щем справочнике и выполнение команд, вводимых с терминала,
до получения сигнала конец_файла или прерывание. Сигнал
прерывание действует только по окончании выполнения команды.
Текст процедуры scan имеет следующий вид:

    d=`pwd`


for i in *
do if test -d $d/$i
then cd $d/$i
while echo $i:
trap exit 2
read x
do trap : 2; eval $x; done
fi
done

Встроенная команда read x считывает строки из файла стан-
дартного ввода и присваивает результат их выполнения макро-
переменной x. Сигналы конец_файла или прерывание прекращают
выполнение этой команды с кодом завершения, не равным нулю.

5. ВЫЗОВ ИНТЕРПРЕТАТОРА

Вслед за регистрацией пользователя в системе (с помощью
команды login) вызывается интерпретатор языка SHELL. Если
регистрационный справочник пользователя содержит файл .pro-
file, то прежде чем с терминала будет принята хотя бы одна
команда, интерпретатор выполняет этот файл (подразумевается,
что файл .profile содержит команды).

При вызове могут указываться следующие ключи:

-c строка
Команды считываются из заданной строки.

-s Команды читаются из стандартного файла ввода. Сообще-
ния интерпретатора записываются в стандартный файл
диагностик.

-i Интерактивный режим работы.

Если первым символом параметра "0" является знак -, то
команды считываются из файла .profile.

6. СВОДКА ОСНОВНЫХ КОНСТРУКЦИЙ ЯЗЫКА SHELL









- 34 -










Таблица 2

СПЕЦИАЛЬНЫЕ СИМВОЛЫ

------------------------------------------------------------
Символ Описание
------------------------------------------------------------
# коментарий;
| создать канал связи процессов;
~ создать канал связи процессов;
; разделитель команд;
& запустить следующий процесс, не ожидая окончания пре-
дыдущего;
&& выполнить следующую команду, если код завершения пре-
дыдущей равен нулю;
|| выполнить следующую команду, если код завершения пре-
дыдущей не равен нулю;
'...' литеральная константа;
"..." после подстановки значений макропеременных, строка
рассматривается как литеральная константа;
\ отменяет специальное значение следующего за ним сим-
вола.
------------------------------------------------------------

Таблица 3

ВВОД-ВЫВОД

------------------------------------------------------------
Конструкция Описание
------------------------------------------------------------
[d]<&lt; следующий параметр является именем файла, кото-
рый используется в качестве стандартного файла
ввода с дескриптором d (по умолчанию d=0);
[d]>&gt; следующий параметр является именем файла, кото-
рый используется в качестве стандартного файла
вывода с дескриптором d (по умолчанию d=1);
[d]>&gt;>&gt; то же что >&gt;, за исключением того, что выводимая
информация дописывается к концу содержимого
файла;
[d]<&lt;<&lt; ввод осуществляется до тех пор, пока не встре-
чается последовательность символов, стоящая за
данной конструкцией;
[d]<&lt;&цифра в качестве стандартный файла ввода используется
файл с дескриптором цифра;
[d]>&gt;&цифра в качестве файла стандартного вывода использу-
ется файл с дескриптором цифра;
[d]<&lt;&- закрыть стандартный файл ввода;
[d]<&lt;>&gt; открыть указанный файл для чтения (записи).
------------------------------------------------------------





- 35 -










Таблица 4

ЗАДАНИЕ ИМЕН ФАЙЛОВ

------------------------------------------------------------
Конструкция Описание
------------------------------------------------------------
? соответствует одиночному символу;
* соответствует строке символов (в т.ч. пустой);
[...] соответствует одному из перечисленных символов;
пара символов, разделенная знаком -, соответст-
вует любому символу из указанного промежутка;
------------------------------------------------------------

Таблица 5

ПОДСТАНОВКА ЗНАЧЕНИЙ ПАРАМЕТРОВ

------------------------------------------------------------
Конструкция Описание
------------------------------------------------------------
$n заменить $n значением n;
$* "1 2 ..."
$@ "1" "2" ...
$# число позиционных параметров;
$- ключи, которые вводятся при вызове или с
помощью команды set;
$? код завершения последней команды;
$$ номер текущего процесса;
$! номер процесса последней фоновой команды;
имя=значение определение макропеременной;
${имя-слово} если имя определено, подставить значение,
иначе - слово;
${имя=слово} использовать значение имени; если не опреде-
лено - присвоить и использовать значение
слово;
${имя?слово} использовать значение имени, если определено,
иначе - напечатать слово и прекратить выполне-
ние командного файла;
${имя+слово} использовать слово, если имя определено, иначе
- ничего не делать;
$HOME имя справочника для команды cd без параметров;
$PATH список имен справочников для поиска команд;
$MAIL файл для приема почты;
$PS1 подсказка интерпретатора (по умолчанию $);
$PS2 подсказка интерпретатора для продолжении ввода
команды (по умолчанию >&gt;);
$IFS разделители слов командной строки (по умолча-
нию пробел, знак табуляции и новой строки);
------------------------------------------------------------





- 36 -










Продолжение таблицы 5

------------------------------------------------------------
Конструкция Описание
------------------------------------------------------------
$TERM тип терминала.
------------------------------------------------------------
















































- 37 -










КОМАНДНЫЙ ЯЗЫК


for имя [in слово...]
do список_команд
done


case слово in
[обр1 [|обр2]...) список_команд;;]
...
esac


if список_команд
then список_команд
[elif список_команд then список_команд]
[else список_команд]
fi


while список_команд
[do список_команд]
done


until список_команд
[do список_команд]
done


(список_команд)


{ список_команд; }


break [n]
выход из циклов for, case, while или until на уровне n;

continue
переход к следующей итерации цикла for, while или
until;

exit [N]
выход с кодом завершения N;

: не производит никаких действий, за исключением подста-
новки значений макропеременных.






- 38 -










ВСТРОЕННЫЕ КОМАНДЫ


. файл
выполнить командный файл в рамках текущего процесса;

eval [команда ...]
провести все макроподстановки и выполнить "команду
...";

exec [команда ...]
текущий процесс заменить процессом выполнения команды
...;

export [имя ...]
копировать определение макропеременной имя в среду
порождаемых процессов;

read имя ...
считать файл стандартного ввода и присвоить значение
макропеременной имя;

readonly [имя ...]
запретить переопределение макропеременой;

set [-ekntuvx [пар ...]]
установить режимы работы интерпретатора (значения клю-
чей см. в описании команды sh);

shift
переименовать позиционные параметры; 1=2 ...;

times
выдать время, затраченное на выполнение процесса;

trap [команда] [n]
выполнить команду, если получен сигнал n;

umask [nnn]
маска создания файла - обратный код (в восьмеричной
системе);

wait [pid]
ожидать окончания процесса с номером pid.











- 39 -










СОДЕРЖАНИЕ



АННОТАЦИЯ ......................................... 2

1. ВВЕДЕНИЕ .......................................... 3

2. ОСНОВНЫЕ ПОНЯТИЯ .................................. 3
2.1. Простые команды ................................. 4
2.2. Фоновые процессы ................................ 4
2.3. Задание имен файлов ............................. 4
2.4. Отмена специального значения метасимволов ....... 6
2.5. Задание файлов ввода/вывода ..................... 6
2.6. Связь процессов, конвейеры и фильтры ............ 8
2.7. Макропеременные ................................. 9
2.8. Выдача подсказок ................................ 12
2.9. Составные команды ............................... 12
2.10. Встроенные команды .............................. 12

3. КОМАНДНЫЕ ФАЙЛЫ ................................... 15
3.1. Комментарии ..................................... 17
3.2. Команда test .................................... 17
3.3. Оператор for .................................... 18
3.4. Оператор case ................................... 19
3.5. Операторы while и until ......................... 21
3.6. Операторы break и continue ...................... 22
3.7. Оператор if ..................................... 22
3.8. Локальный файл .................................. 24
3.9. Отладка командных файлов ........................ 25

4. ПАРАМЕТРЫ И ОБЛАСТЬ ДЕЙСТВИЯ МАКРОПЕРЕМЕННЫХ ...... 25
4.1. Передача параметров ............................. 29
4.2. Подстановка значений параметров ................. 29
4.3. Подстановка результатов выполнения команд ....... 30
4.4. Обработка ошибок ................................ 31
4.5. Обработка прерываний ............................ 32

5. ВЫЗОВ ИНТЕРПРЕТАТОРА .............................. 34

6. СВОДКА ОСНОВНЫХ КОНСТРУКЦИЙ ЯЗЫКА SHELL ........... 34














- 40 -