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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π˜ΡΠΊΡƒΡΡΡ‚Π²ΠΎ программирования Π½Π° языкС сцСнариСв ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 71

Автор МСндСль ΠšΡƒΠΏΠ΅Ρ€

# "элСктронный диск" -- это ΠΎΠ±Π»Π°ΡΡ‚ΡŒ Π² ΠžΠ—Π£ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°

#+ с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ систСма взаимодСйствуСт ΠΊΠ°ΠΊ с Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмой.

# ОсновноС прСимущСство -- ΠΎΡ‡Π΅Π½ΡŒ высокая ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ чтСния/записи.

# НСдостатки -- ΡΠ½Π΅Ρ€Π³ΠΎΠ·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ, ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΠ΅ объСма ΠžΠ—Π£, доступного систСмС,

# ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ нСбольшой Ρ€Π°Π·ΠΌΠ΅Ρ€.

#

# Π§Π΅ΠΌ Ρ…ΠΎΡ€ΠΎΡˆ элСктронный диск?

# ΠŸΡ€ΠΈ Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠΈ Π½Π°Π±ΠΎΡ€ΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ Ρ‚Π°Π±Π»ΠΈΡ† Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ словарСй, Π½Π° элСктронном дискС

#+ Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ Π²Ρ‹ΡΠΎΠΊΡƒΡŽ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с этими Π½Π°Π±ΠΎΡ€Π°ΠΌΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ врСмя доступа ΠΊ ΠžΠ—Π£

# Π½Π΅ΠΈΠ·ΠΌΠ΅Ρ€ΠΈΠΌΠΎ мСньшС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ доступа ΠΊ ТСсткому диску.


E_NON_ROOT_USER=70 # Π‘Ρ†Π΅Π½Π°Ρ€ΠΈΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒΡΡ с ΠΏΡ€Π°Π²Π°ΠΌΠΈ root.

ROOTUSER_NAME=root


MOUNTPT=/mnt/ramdisk

SIZE=2000 # 2K Π±Π»ΠΎΠΊΠΎΠ² (ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚Π΅, Ссли это Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ)

BLOCKSIZE=1024 # Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±Π»ΠΎΠΊΠ° -- 1K (1024 Π±Π°ΠΉΡ‚)

DEVICE=/dev/ram0 # ΠŸΠ΅Ρ€Π²ΠΎΠ΅ устройство ram


username=`id -nu`

if [ "$username" != "$ROOTUSER_NAME" ]

then

echo "Π‘Ρ†Π΅Π½Π°Ρ€ΠΈΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒΡΡ с ΠΏΡ€Π°Π²Π°ΠΌΠΈ root."

exit $E_NON_ROOT_USER

fi


if [ ! -d "$MOUNTPT" ] # ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° наличия Ρ‚ΠΎΡ‡ΠΊΠΈ монтирования,

then #+ благодаря этой ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅, ΠΏΡ€ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹Ρ… запусках сцСнария

mkdir $MOUNTPT #+ ошибки Π²ΠΎΠ·Π½ΠΈΠΊΠ°Ρ‚ΡŒ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚.

fi


dd if=/dev/zero of=$DEVICE count=$SIZE bs=$BLOCKSIZE # ΠžΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ элСктронный диск.

mke2fs $DEVICE # Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»ΠΎΠ²ΡƒΡŽ систСму ext2.

mount $DEVICE $MOUNTPT # Π‘ΠΌΠΎΠ½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ.

chmod 777 $MOUNTPT # Π‘Π΄Π΅Π»Π°Ρ‚ΡŒ элСктронный диск доступным для ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ.

# Но ΠΏΡ€ΠΈ этом, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ root смоТСт Π΅Π³ΠΎ ΠΎΡ‚ΠΌΠΎΠ½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ.


echo "Π­Π»Π΅ΠΊΡ‚Ρ€ΠΎΠ½Π½Ρ‹ΠΉ диск \"$MOUNTPT\" Π³ΠΎΡ‚ΠΎΠ² ΠΊ Ρ€Π°Π±ΠΎΡ‚Π΅."

# Π’Π΅ΠΏΠ΅Ρ€ΡŒ элСктронный диск доступСн для любого ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π² систСмС.


# Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅! Π­Π»Π΅ΠΊΡ‚Ρ€ΠΎΠ½Π½Ρ‹ΠΉ диск -- это энСргозависимоС устройство! ВсС Π΄Π°Π½Π½Ρ‹Π΅, хранящиСся Π½Π° Π½Π΅ΠΌ,

#+ Π±ΡƒΠ΄ΡƒΡ‚ утСряны ΠΏΡ€ΠΈ остановкС ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅ систСмы.

# Если эти Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ для вас интСрСс, Ρ‚ΠΎ сохраняйтС ΠΈΡ… ΠΊΠΎΠΏΠΈΠΈ Π² ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅.


# ПослС ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ вновь ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ элСктронный диск, запуститС этот сцСнарий.

# ΠŸΡ€ΠΎΡΡ‚ΠΎΠ΅ ΠΌΠΎΠ½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ /mnt/ramdisk, Π±Π΅Π· выполнСния ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… дСйствий, Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ.


exit 0

Π“Π»Π°Π²Π° 29. ΠžΡ‚Π»Π°Π΄ΠΊΠ° сцСнариСв

Командная ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ° Bash Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ своСго ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ°, ΠΈ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π°ΠΆΠ΅ ΠΊΠ°ΠΊΠΈΡ… Π»ΠΈΠ±ΠΎ ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½Ρ‹Ρ… ΠΊΠΎΠΌΠ°Π½Π΄ ΠΈΠ»ΠΈ конструкций[ 59 ]. БинтаксичСскиС ошибки ΠΈΠ»ΠΈ ΠΎΠΏΠ΅Ρ‡Π°Ρ‚ΠΊΠΈ часто Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ сообщСния ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ практичСски Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‚ ΠΏΡ€ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 29-1. Π‘Ρ†Π΅Π½Π°Ρ€ΠΈΠΉ, содСрТащий ΠΎΡˆΠΈΠ±ΠΊΡƒ

#!/bin/bash

# ex74.sh


# Π­Ρ‚ΠΎΡ‚ сцСнарий содСрТит ΠΎΡˆΠΈΠ±ΠΊΡƒ.


a=37


if [$a -gt 27 ]

then

echo $a

fi


exit 0

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ исполнСния этого сцСнария Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ Ρ‚Π°ΠΊΠΎΠ΅ сообщСниС:

./ex74.sh: [37: command not found

Π§Ρ‚ΠΎ Π² этом сцСнарии ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ (подсказка: послС ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова if)?

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 29-2. ΠŸΡ€ΠΎΠΏΡƒΡ‰Π΅Π½ΠΎ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово

#!/bin/bash

# missing-keyword.sh:

# КакоС сообщСниС ΠΎΠ± ошибкС Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π²Π΅Π΄Π΅Π½ΠΎ, ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ этот сцСнарий?


for a in 1 2 3

do

echo "$a"

# done # НСобходимоС ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово 'done' Π·Π°ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ.


exit 0

На экранС появится сообщСниС:

missing-keyword.sh: line 11: syntax error: unexpected end of file

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, сообщСниС ΠΎΠ± ошибкС Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π½ΠΎΠΌΠ΅Ρ€ Π½Π΅ Ρ‚ΠΎΠΉ строки, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° ошибка, Π° Ρ‚ΠΎΠΉ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Bash Ρ‚ΠΎΡ‡Π½ΠΎ установил Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½ΠΎΠΉ ситуации.

БообщСния ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π½ΠΎΠΌΠ΅Ρ€Π° строки, ΠΏΡ€ΠΈ исполнСнии ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ эта ошибка появилась.

А Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ, Ссли сцСнарий Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Π½ΠΎ Π½Π΅ Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ оТидалось? Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ вСсьма распространСнной логичСской ошибки.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 29-3. test24

#!/bin/bash


# ΠžΠΆΠΈΠ΄Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ этот сцСнарий Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅

#+ всС Ρ„Π°ΠΉΠ»Ρ‹, ΠΈΠΌΠ΅Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… содСрТат ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹.

# Но ΠΎΠ½ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚. ΠŸΠΎΡ‡Π΅ΠΌΡƒ?


badname=`ls | grep ' '`


# echo "$badname"


rm "$badname"


exit 0

ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ Π½Π°ΠΉΡ‚ΠΈ ΠΎΡˆΠΈΠ±ΠΊΡƒ, раскоммСнтарив строку echo "$badname". Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ echo ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Π° ΠΏΡ€ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅ сцСнариСв, ΠΎΠ½Π° позволяСт ΡƒΠ·Π½Π°Ρ‚ΡŒ -- Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π»ΠΈ Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠΆΠΈΠ΄Π°Π»ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ.

Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌ случаС, ΠΊΠΎΠΌΠ°Π½Π΄Π° rm "$badname" Π½Π΅ Π΄Π°Π΅Ρ‚ ΠΆΠ΅Π»Π°Π΅ΠΌΠΎΠ³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ пСрСмСнная $badname взята Π² ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅, rm ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ СдинствСнный Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ (Ρ‚.Π΅. ΠΊΠΎΠΌΠ°Π½Π΄Π° Π±ΡƒΠ΄Π΅Ρ‚ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»Π° имя ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°). Частично эта ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½Π° Π·Π° счСт удалСния ΠΊΠ°Π²Ρ‹Ρ‡Π΅ΠΊ Π²ΠΎΠΊΡ€ΡƒΠ³ $badname ΠΈ установки ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ $IFS Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½Π° содСрТала Ρ‚ΠΎΠ»ΡŒΠΊΠΎ символ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° строки, IFS=$'\n'. Однако, сущСствуСт Π±ΠΎΠ»Π΅Π΅ простой способ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ эту Π·Π°Π΄Π°Ρ‡Ρƒ.

# ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ способ удалСния Ρ„Π°ΠΉΠ»ΠΎΠ², Π² Ρ‡ΡŒΠΈΡ… ΠΈΠΌΠ΅Π½Π°Ρ… содСрТатся ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹.

rm *\ *

rm *" "*

rm *' '*

# Бпасибо S.C.


Π’ ΠΎΠ±Ρ‰ΠΈΡ… Ρ‡Π΅Ρ€Ρ‚Π°Ρ…, ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½Ρ‹ΠΌΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ сцСнарии, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅

1. "ΡΡ‹ΠΏΠ»ΡŽΡ‚" сообщСниями ΠΎ "синтаксичСских ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…" ΠΈΠ»ΠΈ

2. Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ, Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π½Π΅ Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ оТидалось (логичСскиС ошибки).

3. Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ, Π΄Π΅Π»Π°ΡŽΡ‚ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ трСбуСтся, Π½ΠΎ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Π΅ эффСкты (логичСская Π±ΠΎΠΌΠ±Π°).


Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ ΠΏΡ€ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅ Π½Π΅Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΡ… сцСнариСв

1. ΠΊΠΎΠΌΠ°Π½Π΄Π° echo, Π² критичСских Ρ‚ΠΎΡ‡ΠΊΠ°Ρ… сцСнария, ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ состояниС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ Ρ…ΠΎΠ΄ исполнСния.

2. ΠΊΠΎΠΌΠ°Π½Π΄Π°-Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ tee, которая ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ процСссы ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π² критичСских мСстах.

3. ΠΊΠ»ΡŽΡ‡ΠΈ -n -v -x

sh -n scriptname -- ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ синтаксичСских ошибок, Π½Π΅ запуская сам сцСнарий. Π’ΠΎΠ³ΠΎ ΠΆΠ΅ эффСкта ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ, вставив Π² сцСнарий ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ set -n ΠΈΠ»ΠΈ set -o noexec. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· синтаксичСских ошибок Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ выявлСны Ρ‚Π°ΠΊΠΈΠΌ способом.

sh -v scriptname -- Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ ΠΏΡ€Π΅ΠΆΠ΄Π΅, Ρ‡Π΅ΠΌ ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π°. Π’ΠΎΠ³ΠΎ ΠΆΠ΅ эффСкта ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ, вставив Π² сцСнарий ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ set -v ΠΈΠ»ΠΈ set -o verbose.

ΠšΠ»ΡŽΡ‡ΠΈ -n ΠΈ -v ΠΌΠΎΠ³ΡƒΡ‚ ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π»ΡΡ‚ΡŒΡΡ совмСстно: sh -nv scriptname.

sh -x scriptname -- Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚, Π² ΠΊΡ€Π°Ρ‚ΠΊΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ исполнСния ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹. Π’ΠΎΠ³ΠΎ ΠΆΠ΅ эффСкта ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ, вставив Π² сцСнарий ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ set -x ΠΈΠ»ΠΈ set -o xtrace.

Вставив Π² сцСнарий set -u ΠΈΠ»ΠΈ set -o nounset, Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ сообщСниС ΠΎΠ± ошибкС unbound variable всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° обращСния ΠΊ нСобъявлСнной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ.

4. Ѐункция "assert", прСдназначСнная для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ условий, Π² критичСских Ρ‚ΠΎΡ‡ΠΊΠ°Ρ… сцСнария. (Π­Ρ‚Π° идСя заимствована ΠΈΠ· языка программирования C.)

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 29-4. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° условия с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ "assert"

#!/bin/bash

# assert.sh


assert () # Если условиС Π»ΠΎΠΆΠ½ΠΎ,

{ #+ Π²Ρ‹Ρ…ΠΎΠ΄ ΠΈΠ· сцСнария с сообщСниСм ΠΎΠ± ошибкС.

E_PARAM_ERR=98

E_ASSERT_FAILED=99


if [ -z "$2" ] # НСдостаточноС количСство Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ².

then

return $E_PARAM_ERR

fi


lineno=$2


if [ ! $1 ]

then

echo "Π£Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π»ΠΎΠΆΠ½ΠΎ: \"$1\""

echo "Π€Π°ΠΉΠ»: \"$0\", строка: $lineno"

exit $E_ASSERT_FAILED

# else

# return

# ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ исполнСниС сцСнария.

fi

}


a=5

b=4

condition="$a -lt $b" # Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ ΠΎΠ± ΠΎΡ‰ΠΈΠ±ΠΊΠ΅ ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ сцСнария.

# ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ условиС "condition"

#+ Π½Π° Ρ‡Ρ‚ΠΎ Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ ΠΈ

#+ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ -- Ρ‡Ρ‚ΠΎ получится.


assert "$condition" $LINENO

# Π‘Ρ†Π΅Π½Π°Ρ€ΠΈΠΉ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ случаС, Ссли ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ истинно.


# ΠŸΡ€ΠΎΡ‡ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹.

# ...

echo "Π­Ρ‚Π° строка появится Π½Π° экранС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ истинно."

# ...

# ΠŸΡ€ΠΎΡ‡ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹.

# ...


exit 0

5. Π›ΠΎΠ²ΡƒΡˆΠΊΠ° Π½Π° Π²Ρ‹Ρ…Ρ‚ΠΎ Π² этом сцСнарии ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ (подсказка: послС ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ словодС.

Команда exit, Π² сцСнарии, ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅Ρ‚ сигнал 0, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ процСсс Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ, Ρ‚.Π΅. -- сам сцСнарий[ 60 ]. Часто Π±Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ ΠΏΠΎ Π²Ρ‹Ρ…ΠΎΠ΄Ρƒ ΠΈΠ· сцСнария Π²Ρ‹Π΄Π°Ρ‚ΡŒ "распСчатку" ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ….


Установка Π»ΠΎΠ²ΡƒΡˆΠ΅ΠΊ Π½Π° сигналы

trap

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅Ρ‚ дСйствиС ΠΏΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ сигнала; Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΏΠΎΠ»Π΅Π·Π½Π° ΠΏΡ€ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅.

Π‘ΠΈΠ³Π½Π°Π» (signal) -- это просто сообщСниС, пСрСдаСтся процСссу Π»ΠΈΠ±ΠΎ ядром, Π»ΠΈΠ±ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠΌ процСссом, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ±ΡƒΠ΄ΠΈΡ‚ΡŒ процСсс Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅ Π»ΠΈΠ±ΠΎ дСйствия (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ -- Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ). НапримСр, Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ Π½Π° Control-C, Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ сигнала SIGINT, ΠΈΡΠΏΠΎΠ»Π½ΡΡŽΡ‰Π΅ΠΉΡΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅.

trap '' 2

# Π˜Π³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠ΅ 2 (Control-C), дСйствиС ΠΏΠΎ сигналу Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½ΠΎ.


trap 'echo "Control-C disabled."' 2

# Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ Π½Π° Control-C.


ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 29-5. Π›ΠΎΠ²ΡƒΡˆΠΊΠ° Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄Π΅

#!/bin/bash


trap 'echo Бписок ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… --- a = $a b = $b' EXIT

# EXIT -- это Π½Π°Π·Π²Π°Π½ΠΈΠ΅ сигнала, Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ ΠΏΡ€ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΈΠ· сцСнария.


a=39


b=36


exit 0

# ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‡Ρ‚ΠΎ Ссли Π·Π°ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ 'exit',

# Ρ‚ΠΎ это Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ скаТСтся Π½Π° Ρ€Π°Π±ΠΎΡ‚Π΅ сцСнария,

# ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ "Π²Ρ‹Ρ…ΠΎΠ΄" ΠΈΠ· сцСнария происходит Π² любом случаС.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 29-6. Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ Π½Π° Control-C