Основы программирования в Linux
Напоминаем, что обычно сценарии обрабатываются интерпретатором сверху вниз, поэтому вы должны задать, команду
перед той частью сценария, которую хотите защитить.trapДля возврата к стандартной реакции на сигнал, просто задайте
каккоманду. Для игнорирования сигнала задайте в-пустую строкукоманде. Команда trap без параметров выводит текущий список перехватов и действий.''В табл. 2.9 перечислены самые важные, включенные в. стандарт Х/Open сигналы, которые можно отследить (со стандартными номерами в скобках). Дополнительную информацию можно найти на страницах раздела 7 интерактивного справочного руководства, посвященного сигналам (
).man 7 signalТаблица 2.9
Сигнал Описание HUP (1)Неожиданный останов; обычно посылается, когда отключается терминал или пользователь выходит из системы INT (2)Прерывание; обычно посылается нажатием комбинации клавиш <Ctrl>+<C> QUIT (3)Завершение выполнения; обычно посылается нажатием комбинации клавиш <Ctrl>+<\> ABRT (6)Аварийное завершение; обычно посылается при возникновении серьезной ошибки выполнения ALRM (14)Аварийный сигнал; обычно посылается для обработки превышений лимита времени TERM (15)Завершение; обычно посылается системой, когда она завершает работу А теперь выполните упражнение 2.15.
Упражнение 2.15. Сигналы прерыванийВ следующем сценарии показана простая обработка сигнала.
#!/bin/shtrap 'rm -f /tmp/my_tmp_file_$$' INTecho creating file /tmp/my_tmp_file_$$date > /tmp/my_tmp_file_$$echo "press interrupt (CTRL-C) to interrupt..."while [ -f /tmp/my_tmp_file_$$ ] ; doecho File existssleep 1doneecho The file no longer exists trap INTecho creating file /tmp/my_tmp_file_$$date > /tmp/my_tmp_file_$$echo "press interrupt (CTRL-C) to interrupt..."while [ -f /tmp/my_tmp_file_$$ ]; doecho File existssleep 1doneecho we never get hereexit 0Если вы выполните этот сценарий, нажимая и удерживая нажатой клавишу <Ctrl> и затем нажимая клавишу <C> (или любую другую прерывающую комбинацию клавиш) в каждом из циклов, то получите следующий вывод:
creating file /tmp/my_tmp_file_141press interrupt (CTRL-C) to interrupt ...File existsFile existsFile existsFile existsThe file no longer existscreating file /tmp/my tmp_file_141press interrupt (CTRL-C) to interrupt ...File existsFile existsFile existsFile existsКак это работает
Сценарий использует команду
для организации выполнения командыtrapпри возникновении сигналаrm -f /tmp/my_tmp_file_$$(прерывание). Затем сценарий выполняет циклINTдо тех пор, пока существует файл. Когда пользователь нажимает комбинацию клавиш <Ctrl>+<C>, выполняется командаwhile, а затем возобновляется выполнение циклаrm -f /tmp/my_tmp_file_$$. Поскольку теперь файл удален, первый циклwhileзавершается стандартным образом.whileДалее сценарий снова применяет команду
, на этот раз для того, чтобы сообщить, что при возникновении сигналаtrapникакая команда не выполняется. Затем сценарий создает заново файл и выполняет второй циклINT. Когда пользователь снова нажимает комбинацию клавиш <Ctrl>+<C>, не задана команда для выполнения, поэтому реализуется стандартное поведение: немедленное прекращение выполнения сценария. Поскольку сценарий завершается немедленно, заключительные командыwhileиechoникогда не выполняются.exitunsetКоманда
удаляет переменные или функции из окружения. Она не может проделать это с переменными, предназначенными только для чтения и определенными командной оболочкой, такими какunset. Команда применяется редко.IFSВ следующем сценарии сначала выводится строка
, а во второй раз новая строка.Hello world#!/bin/shfoo="Hello World"echo $foounset fooecho $fooПримечаниеНаписание
подобно, но не идентично применению командыfoo=в только что приведенной программе. Операторunsetзадает для переменнойfoo=значениеfoo, но при этом переменнаяnullвсе еще существует. Командаfooудаляет из окружения переменнуюunset foo.foo