Команду setможно также применять для передачи параметров командной оболочке и тем самым управления режимом ее работы. Наиболее часто используемый вариант команды set -х, который заставляет сценарий выводить на экран трассировку выполняемой в данный момент команды. Мы обсудим команду setи ее дополнительные опции позже в этой главе, когда будем рассматривать отладку программ.
shift
Команда shiftсдвигает все переменные-параметры на одну позицию назад, так что параметр $2становится параметром $1, параметр $3— $2и т.д. Предыдущее значение параметра $1отбрасывается, а значение параметра $0остается неизменным. Если в вызове команды shiftзадан числовой параметр, параметры сдвигаются на указанное количество позиций. Остальные переменные $*, $@и $#также изменяются в связи с новой расстановкой переменных-параметров.
Команда shiftчасто полезна при поочередном просмотре параметров, переданных в сценарий, и если вашему сценарию требуется 10 и более параметров, вам понадобится команда shiftдля обращения к 10-му параметру и следующим за ним.
Например, вы можете просмотреть все позиционные параметры:
#!/bin/sh
while [ "$1" != "" ]; do
echo "$1"
shift
done
exit 0
trap
Команда trapприменяется для задания действий, предпринимаемых при получении сигналов, которые подробно будут обсуждаться далее в этой книге. Обычное действие — удалить сценарий, когда он прерван. Исторически командные оболочки всегда использовали числа для обозначения сигналов, но в современных сценариях следует применять имена, которые берутся из файла signal.h директивы #includeс опущенным префиксом SIG .Для того чтобы посмотреть номера сигналов и соответствующие им имена, можно ввести в командной строке команду trap -l.
Примечание
Для тех, кто не знаком с сигналами, это события, асинхронно посылаемые программе. Стандартно они обычно вызывают прекращение выполнения программы.
С помощью команды trapпередается предпринимаемое действие, за которым следует имя (имена) сигнала для перехвата:
trap команда сигнал
Напоминаем, что обычно сценарии обрабатываются интерпретатором сверху вниз, поэтому вы должны задать, команду trapперед той частью сценария, которую хотите защитить.
Для возврата к стандартной реакции на сигнал, просто задайте команду как -. Для игнорирования сигнала задайте в команде пустую строку ''. Команда trap без параметров выводит текущий список перехватов и действий.
В табл. 2.9 перечислены самые важные, включенные в. стандарт Х/Open сигналы, которые можно отследить (со стандартными номерами в скобках). Дополнительную информацию можно найти на страницах раздела 7 интерактивного справочного руководства, посвященного сигналам ( man 7 signal).
Таблица 2.9
| Сигнал |
Описание |
HUP (1) |
Неожиданный останов; обычно посылается, когда отключается терминал или пользователь выходит из системы |
INT (2) |
Прерывание; обычно посылается нажатием комбинации клавиш + |
QUIT (3) |
Завершение выполнения; обычно посылается нажатием комбинации клавиш +<\> |
ABRT (6) |
Аварийное завершение; обычно посылается при возникновении серьезной ошибки выполнения |
ALRM (14) |
Аварийный сигнал; обычно посылается для обработки превышений лимита времени |
TERM (15) |
Завершение; обычно посылается системой, когда она завершает работу |
А теперь выполните упражнение 2.15.
Упражнение 2.15. Сигналы прерываний
В следующем сценарии показана простая обработка сигнала.
#!/bin/sh
trap 'rm -f /tmp/my_tmp_file_$$' INT
echo creating file /tmp/my_tmp_file_$$
date > /tmp/my_tmp_file_$$
echo "press interrupt (CTRL-C) to interrupt..."
while [ -f /tmp/my_tmp_file_$$ ] ; do
echo File exists
sleep 1
done
echo The file no longer exists trap INT
echo creating file /tmp/my_tmp_file_$$
date > /tmp/my_tmp_file_$$
echo "press interrupt (CTRL-C) to interrupt..."
while [ -f /tmp/my_tmp_file_$$ ]; do
echo File exists
sleep 1
done
echo we never get here
exit 0
Если вы выполните этот сценарий, нажимая и удерживая нажатой клавишу и затем нажимая клавишу (или любую другую прерывающую комбинацию клавиш) в каждом из циклов, то получите следующий вывод:
Читать дальше