Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠžΡΠ½ΠΎΠ²Ρ‹ программирования Π² LinuxΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 30

Автор ΠœΡΡ‚ΡŒΡŽ НСйл

НапоминаСм, Ρ‡Ρ‚ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ сцСнарии ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ΠΎΠΌ свСрху Π²Π½ΠΈΠ·, поэтому Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π΄Π°Ρ‚ΡŒ, ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ

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/sh

trap 'rm -f /tmp/my_tmp_file_$$' INT

echo creating file /tmp/my_tmp_file_$$

date &gt; /tmp/my_tmp_file_$$

echo &quot;press interrupt (CTRL-C) to interrupt...&quot;

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 &gt; /tmp/my_tmp_file_$$

echo &quot;press interrupt (CTRL-C) to interrupt...&quot;

while [ -f /tmp/my_tmp_file_$$ ]; do

Β echo File exists

Β sleep 1

done

echo we never get here

exit 0

Если Π²Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ этот сцСнарий, наТимая ΠΈ удСрТивая Π½Π°ΠΆΠ°Ρ‚ΠΎΠΉ ΠΊΠ»Π°Π²ΠΈΡˆΡƒ <Ctrl> ΠΈ Π·Π°Ρ‚Π΅ΠΌ наТимая ΠΊΠ»Π°Π²ΠΈΡˆΡƒ <C> (ΠΈΠ»ΠΈ Π»ΡŽΠ±ΡƒΡŽ Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°ΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ клавиш) Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· Ρ†ΠΈΠΊΠ»ΠΎΠ², Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²Ρ‹Π²ΠΎΠ΄:

creating file /tmp/my_tmp_file_141

press interrupt (CTRL-C) to interrupt ...

File exists

File exists

File exists

File exists

The file no longer exists

creating file /tmp/my tmp_file_141

press interrupt (CTRL-C) to interrupt ...

File exists

File exists

File exists

File exists

Как это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚

Π‘Ρ†Π΅Π½Π°Ρ€ΠΈΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ

trap
для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ выполнСния ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹
rm -f /tmp/my_tmp_file_$$
ΠΏΡ€ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ сигнала
INT
(ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠ΅). Π—Π°Ρ‚Π΅ΠΌ сцСнарий выполняСт Ρ†ΠΈΠΊΠ»
while
Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° сущСствуСт Ρ„Π°ΠΉΠ». Когда ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π°ΠΆΠΈΠΌΠ°Π΅Ρ‚ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ клавиш <Ctrl>+<C>, выполняСтся ΠΊΠΎΠΌΠ°Π½Π΄Π°
rm -f /tmp/my_tmp_file_$$
, Π° Π·Π°Ρ‚Π΅ΠΌ возобновляСтся Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ†ΠΈΠΊΠ»Π°
while
. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρ„Π°ΠΉΠ» ΡƒΠ΄Π°Π»Π΅Π½, ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Ρ†ΠΈΠΊΠ»
while
Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ стандартным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

Π”Π°Π»Π΅Π΅ сцСнарий снова примСняСт ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ

trap
, Π½Π° этот Ρ€Π°Π· для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ сигнала
INT
никакая ΠΊΠΎΠΌΠ°Π½Π΄Π° Π½Π΅ выполняСтся. Π—Π°Ρ‚Π΅ΠΌ сцСнарий создаСт Π·Π°Π½ΠΎΠ²ΠΎ Ρ„Π°ΠΉΠ» ΠΈ выполняСт Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ†ΠΈΠΊΠ»
while
. Когда ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ снова Π½Π°ΠΆΠΈΠΌΠ°Π΅Ρ‚ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ клавиш <Ctrl>+<C>, Π½Π΅ Π·Π°Π΄Π°Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° для выполнСния, поэтому рСализуСтся стандартноС ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅: Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠ΅ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π΅Π½ΠΈΠ΅ выполнСния сцСнария. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ сцСнарий Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ, Π·Π°ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹
echo
ΠΈ
exit
Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ.

unset

Команда

unset
удаляСт ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ· окруТСния. Она Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠ΄Π΅Π»Π°Ρ‚ΡŒ это с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΌΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΎΠΉ, Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ
IFS
. Команда примСняСтся Ρ€Π΅Π΄ΠΊΠΎ.

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ сцСнарии сначала выводится строка

Hello world
, Π° Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ€Π°Π· новая строка.

#!/bin/sh

foo=&quot;Hello World&quot;

echo $foo

unset foo

echo $foo

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

НаписаниС

foo=
ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ, Π½ΠΎ Π½Π΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹
unset
Π² Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅. ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€
foo=
Π·Π°Π΄Π°Π΅Ρ‚ для ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ
foo
Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
null
, Π½ΠΎ ΠΏΡ€ΠΈ этом пСрСмСнная
foo
всС Π΅Ρ‰Π΅ сущСствуСт. Команда
unset foo
удаляСт ΠΈΠ· окруТСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ
foo
.