
- •Содержание
- •Введение
- •1.Основные положения Shell.
- •2.Команды и создание командных оболочек.
- •2.1.Команды.
- •2.2. Как Shell находит команды.
- •3.Пример работы интерпретатора Shell.
- •4.Специальные команды Shell.
- •5.Правила программирования в Shell.
- •6.Выполнение shell-программ
- •6.1. Запуск shell'а
- •6.2. Выполнение
- •6.3. Окружение
- •6.4. Сигналы
- •6.5. Замечания
- •7.Число генерируемых процессов.
- •8.Метасимволы, синтекс и зарезервированные слова
- •8.1.Синтаксис Shell
- •8.2. Синтаксические
- •Список литературы
6.4. Сигналы
UNIX'ом поддерживаются следующие сигналы:
SIGHUP - 1 - отменить (hangup)
SIGINT - 2 - прерывание (interrupt)
SIGQUIT - 3 - нестандартный выход (quit)
SIGILL - 4 - неверная команда (illegal instruction)
SIGTRAP - 5 - ловушка (trace trap)
SIGFPE - 8 - исключительная ситуация при выполнении операций с плавающей запятой (floating-point exception)
SIGKILL - 9 - уничтожение процесса (kill)
SIGBUS - 10 - ошибка шины (bus error)
SIGSEGV - 11 - нарушение сегментации (segmentation violation)
SIGSYS - 12 - неверный системный вызов (bad argument to system call)
SIGPIPE - 13 - запись в канал без чтения из него (write on a pipe with no one to read it)
SIGALRM - 14 - будильник (alarm clock)
SIGTERM - 15 - программное завершение процесса (software termination signal)
Сигналы SIGINT и SIGQUIT игнорируются, если команда была запущена асинхронно. Иначе сигналы обрабатываются так же, как в процессе-предке, за исключением сигнала SIGSEGV.
6.5. Замечания
При выполнении команд запоминается их местонахождение. Поэтому при создании команды с тем же именем, но находящейся в другой директории, все равно будет выполняться старая команда (если вызов происходит по короткому имени). Для исправления ситуации воспользуйтесь командой hash с ключом -r.
Если вы переименовали текущую или вышележащую директорию, то команда pwd может давать неверную информацию. Для исправления ситуации воспользуйтесь командой cd с полным именем директории.
7.Число генерируемых процессов.
Когда выполняется большое число коротких команд, то действи-
тельное время выполнения может быть значительно увеличено за счет
создания вспомогательных процессов. Процедурами, для которых тре-
буются значительные количества таких процессов, как правило явля-
ются процедуры, в которых выполняется много циклов и которые ге-
нерируют командные последовательности, которые должны интерпрети-
роваться другим Shell.
Если вас беспокоит эффективность выполнения, вам надо знать,
какие команды являются встроенными в Shell, а какие нет. Ниже
приводится список всех встроенных команд:
break, case, cd, continue, echo, eval, exec, exit, export, for, if, read,
readonly, return, set, shift, test, times, trap, umask, until,
wait, while, ., :, {}
Обычные скобки () также являются встроенной командой, но ко-
манда, заключенная в них, выполняется как дочерний процесс, т.е.
Shell разветвляется. Все остальные команды, не указанные в спис-
ке, являются внешними (требуют fork и exec).
Пользователь должен всегда хотя бы приблизительно знать число
процессов, генерируемых процедурой. Для всех приведенных ранее
процедур число генерируемых (не обязательно одновременно) процес-
сов может быть оценено по формуле:
число процессов = (k*n) + c
где k и с - это константы, а n может быть количеством аргументов
процедуры, количеством строк во входном файле, количеством файлов
в каталоге и т.п. Повышение эффективности обычно достигается за
счет уменьшения константы k.
В качестве примера проанализируем процедуру с именем split,
чей текст проведен ниже:
:
# split
trap 'rm temp$$; trap 0; exit' 0 1 2 3 15
start1=0 start2=0
b='[A-Za-z]'
cat > temp$$
# read stdin into temp file
# save original lengths of $1,$2
if test -s "$1"
then start1=`wc -l < $1`
fi
if test -s "$2"
then start2=`wc -l < $2`
fi
grep "$b" temp$$ >> $1
# lines with letters onto $1
grep -v "$b" temp$$ | grep '[0-9]' >> $2
# lines without letters onto $2
total=" `wc -l< temp$$` "
end1=" `wc -l< $1` "
end2=" `wc -l< $2` "
lost=" `expr $total - \($end1 - $start1\)\
- \($end2 - $start2\)` "
echo "$total read, $lost thrown away"
Для каждой итерации в цикле имеется одна команда expr и либо
команда echo или другая команда expr. Еще одна дополнительная ко-
манда echo выполняется в конце процедуры. Если n - число строк на
вводе, то количество процессов равно 2*n+1.
Некоторые разновидности процедур не следует писать на
Shell'е. Так, например, если с каждым символом файла связан один
или несколько процессов, хорошим решением будет перенос процедуры
на язык Си. Shell-процедуры не следует использовать для посим-
вольного сканирования или посимвольного формирования файлов.