Команду 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
Если вы выполните этот сценарий, нажимая и удерживая нажатой клавишу и затем нажимая клавишу (или любую другую прерывающую комбинацию клавиш) в каждом из циклов, то получите следующий вывод:
Читать дальше