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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «Командная строка Linux. ПолноС руководство». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 83

Автор Уильям Шоттс

β€’ dir_name содСрТит пустоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠ² ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΈΠ· этих условий, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΏΡ€ΠΈΠ»ΠΈΡ‡Π½Ρ‹ΠΉ ΠΎΡ…Π²Π°Ρ‚ тСстированиСм.

Π’Π°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ Π² случаС с ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ, тСстированиС Π΅ΡΡ‚ΡŒ функция ΠΎΡ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. НС ΠΊΠ°ΠΆΠ΄ΡƒΡŽ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ сцСнария Π½ΡƒΠΆΠ½ΠΎ Ρ‚Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Π’ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π²Ρ‹Π±ΠΎΡ€ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠ² для тСстирования зависит ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ считаСтся Π²Π°ΠΆΠ½Ρ‹ΠΌ. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ наш Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ нСсти Ρ€Π°Π·Ρ€ΡƒΡˆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ послСдствия, ΠΎΠ½ заслуТиваСт ΠΈ Ρ‚Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ проСктирования, ΠΈ Ρ‚Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ тСстирования.

ΠžΡ‚Π»Π°Π΄ΠΊΠ°


Если тСстированиС выявляСт ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ Π² сцСнарии, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ шагом являСтся ΠΎΡ‚Π»Π°Π΄ΠΊΠ°. Под Β«ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉΒ» ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ понимаСтся нСсоотвСтствиС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² Ρ€Π°Π±ΠΎΡ‚Ρ‹ сцСнария оТиданиям программиста. Π’ этом случаС Π½ΡƒΠΆΠ½ΠΎ Ρ‚ΠΎΡ‡Π½ΠΎ ΠΎΡ‚ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ сцСнарий Π΄Π΅Π»Π°Π΅Ρ‚ ΠΈ ΠΏΠΎΡ‡Π΅ΠΌΡƒ. Поиск ошибок ΠΈΠ½ΠΎΠ³Π΄Π° ΠΎΡ‡Π΅Π½ΡŒ Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ΅ расслСдованиС.

Π’Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сцСнария ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ Π² этом. Богласно ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ Π·Π°Ρ‰ΠΈΡ‚Π½ΠΎΠ³ΠΎ программирования, сцСнарий Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Ρ‚ΡŒ Π½Π΅Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ условия ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ сообщСния. Иногда, ΠΎΠ΄Π½Π°ΠΊΠΎ, Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ странныС ΠΈ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΠ΅ примСнСния Π±ΠΎΠ»Π΅Π΅ слоТных ΠΏΡ€ΠΈΠ΅ΠΌΠΎΠ² Π·Π°Ρ‰ΠΈΡ‚Ρ‹.

Поиск ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ½ΠΎΠΉ области


Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… сцСнариях, особСнно Π΄Π»ΠΈΠ½Π½Ρ‹Ρ…, ΠΈΠ½ΠΎΠ³Π΄Π° ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ оказываСтся использованиС ΠΏΡ€ΠΈΠ΅ΠΌΠ° изолирования области сцСнария, связанной с ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π½Π΅ всСгда являСтся ошибкой, Π½ΠΎ изоляция часто ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΠΏΠΎΠ½ΡΡ‚ΡŒ ΡΡƒΡ‚ΡŒ происходящСго. Один ΠΈΠ· ΠΏΡ€ΠΈΠ΅ΠΌΠΎΠ² изоляции Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Β«Π·Π°ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΒ» Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ сцСнария. НапримСр, ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ наш Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚, ΡƒΠ΄Π°Π»ΡΡŽΡ‰ΠΈΠΉ содСрТимоС ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, ΠΈΠΌΠ΅Π΅Ρ‚ Π»ΠΈ ΠΎΠ½ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ ΠΊ ошибкС:

if [[ -d $dir_name ]]; then

if cd $dir_name; then

rm *

else

echo "cannot cd to '$dir_name'" >&2

exit 1

fi

# else

# echo "no such directory: '$dir_name'" >&2

# exit 1

fi

ΠŸΠΎΠΌΠ΅ΡΡ‚ΠΈΠ² символы коммСнтария Π² Π½Π°Ρ‡Π°Π»ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ строки Π²Π½ΡƒΡ‚Ρ€ΠΈ логичСского Ρ€Π°Π·Π΄Π΅Π»Π° сцСнария, ΠΌΡ‹ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΠ»ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ выполнСния этого Ρ€Π°Π·Π΄Π΅Π»Π°. ΠŸΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ΅ тСстированиС ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚, связан Π»ΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ с ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½Ρ‹ΠΌ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ.

Врассировка


Ошибки часто становятся ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎΠ³ΠΎ направлСния выполнСния сцСнария. Π’ΠΎ Π΅ΡΡ‚ΡŒ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Ρ‹ сцСнария ΠΌΠΎΠ³ΡƒΡ‚ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΈΠ»ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π² Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ порядкС ΠΈΠ»ΠΈ Π² Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹. Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, ΠΊΠ°ΠΊ Π² Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΡ€ΠΎΡ‚Π΅ΠΊΠ°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ ΠΏΡ€ΠΈΠ΅ΠΌΠΎΠΌ трассировки.

Один ΠΈΠ· способов трассировки Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… сообщСний Π² Ρ€Π°Π·Π½Ρ‹Ρ… Ρ‚ΠΎΡ‡ΠΊΠ°Ρ… сцСнария, ΡΠΎΠΎΠ±Ρ‰Π°ΡŽΡ‰ΠΈΡ…, Π³Π΄Π΅ ΠΏΡ€ΠΎΡ‚Π΅ΠΊΠ°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅. НапримСр, Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π² наш Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ сообщСния:

echo "preparing to delete files" >&2

if [[ -d $dir_name ]]; then

if cd $dir_name; then

echo "deleting files" >&2

rm *

else

echo "cannot cd to '$dir_name'" >&2

exit 1

fi

else

echo "no such directory: '$dir_name'" >&2

exit 1

fi

echo "file deletion complete" >&2

Π—Π΄Π΅ΡΡŒ сообщСния ΠΏΠΎΡΡ‹Π»Π°ΡŽΡ‚ΡΡ Π² стандартный Π²Ρ‹Π²ΠΎΠ΄ ошибок, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΈΡ… ΠΎΡ‚ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ Π²Ρ‹Π²ΠΎΠ΄Π°. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ отступы ΠΏΠ΅Ρ€Π΅Π΄ строками с сообщСниями, β€” это упростит ΠΈΡ… поиск, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΈΠ΄Π΅Ρ‚ врСмя ΡƒΠ±Ρ€Π°Ρ‚ΡŒ эти строки.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, запустив сцСнарий, убСдимся, Ρ‡Ρ‚ΠΎ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ² Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ:

[ [email protected] ~]$ deletion-script

preparing to delete files

deleting files

file deletion complete

[ [email protected] ~]$

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, bash ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ встроСнный ΠΌΠ΅Ρ‚ΠΎΠ΄ трассировки, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π² Π²ΠΈΠ΄Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° -x ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ set с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ -x. Π’ΠΎΠ·ΡŒΠΌΠ΅ΠΌ для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° сцСнарий trouble, написанный Ρ€Π°Π½Π΅Π΅, ΠΈ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΡƒΠ΅ΠΌ встроСнный ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ трассировки для всСго сцСнария, Π΄ΠΎΠ±Π°Π²ΠΈΠ² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ -x Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ строку:

#!/bin/bash -x

# trouble: сцСнарий для дСмонстрации распространСнных Π²ΠΈΠ΄ΠΎΠ² ошибок

number=1

if [ $number = 1 ]; then

echo "Number is equal to 1."

else

echo "Number is not equal to 1."

fi

ПослС запуска ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹:

[ [email protected] ~]$ trouble

+ number=1

+ '[' 1 = 1 ']'

+ echo 'Number is equal to 1.'

Number is equal to 1.

Π’ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ трассировки позволяСт ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΎΠΉ Π²ΠΈΠ΄ ΠΏΡ€ΠΈΠΎΠ±Ρ€Π΅Ρ‚Π°ΡŽΡ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ послС примСнСния подстановки. ΠΠ°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ Π·Π½Π°ΠΊΠΈ «плюс» ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‚ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΡ‚ΡŒ Ρ‚Ρ€Π°ΡΡΠΈΡ€ΠΎΠ²ΠΎΡ‡Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΡ‚ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ Π²Ρ‹Π²ΠΎΠ΄Π°. Π—Π½Π°ΠΊ «плюс» β€” это символ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ для Π²Ρ‹Π²ΠΎΠ΄Π° трассировки. Он хранится Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ PS4 (prompt string 4 β€” строка ΠΏΡ€ΠΈΠ³Π»Π°ΡˆΠ΅Π½ΠΈΡ 4). ИзмСним Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ этой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ трассировочный Π²Ρ‹Π²ΠΎΠ΄ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ. НиТС ΠΌΡ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΈ эту ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, Π²ΠΊΠ»ΡŽΡ‡ΠΈΠ² Π² трассировочный Π²Ρ‹Π²ΠΎΠ΄ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ Π½ΠΎΠΌΠ΅Ρ€ выполняСмой строки Π² сцСнарии. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ использования ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹Ρ… ΠΊΠ°Π²Ρ‹Ρ‡Π΅ΠΊ β€” это ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ подстановку Π΄ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°, ΠΊΠΎΠ³Π΄Π° строка ΠΏΡ€ΠΈΠ³Π»Π°ΡˆΠ΅Π½ΠΈΡ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ фактичСски:

[ [email protected] ~]$ export PS4='$LINENO + '

[ [email protected] ~]$ trouble

5 + number=1

7 + '[' 1 = 1 ']'

8 + echo 'Number is equal to 1.'

Number is equal to 1.

Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ трассировку Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π° сцСнария ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ set с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ -x:

#!/bin/bash

# trouble: сцСнарий для дСмонстрации распространСнных Π²ΠΈΠ΄ΠΎΠ² ошибок

number=1

set -x # Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ трассировку

if [ $number = 1 ]; then

echo "Number is equal to 1."

else

echo "Number is not equal to 1."

fi

set +x # Π’Ρ‹ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ трассировку

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ использовали ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ set с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ -x, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ трассировку, ΠΈ с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ +x, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π΅Π΅. Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для исслСдования сразу Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ½Ρ‹Ρ… Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠ² Π² сцСнарии.

ИсслСдованиС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² процСссС выполнСния


Часто вмСстС с трассировкой ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ содСрТимоС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ»Π½ΠΎΠ΅ прСдставлСниС ΠΎ дСйствиях сцСнария. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ для этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ инструкции echo:

#!/bin/bash

# trouble: сцСнарий для дСмонстрации распространСнных Π²ΠΈΠ΄ΠΎΠ² ошибок

number=1

echo "number=$number" # ΠžΠ’Π›ΠΠ”ΠšΠ

set -x # Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ трассировку

if [ $number = 1 ]; then

echo "Number is equal to 1."

else

echo "Number is not equal to 1."

fi

set +x # Π’Ρ‹ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ трассировку

Π’ этом Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ просто Π²Ρ‹Π²Π΅Π»ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ number ΠΈ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΠ»ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ строку ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ Π΅Π΅ поиск ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅. ΠŸΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠ΅ΠΌ особСнно ΠΏΠΎΠ»Π΅Π·Π΅Π½ ΠΏΡ€ΠΈ исслСдовании повСдСния Ρ†ΠΈΠΊΠ»ΠΎΠ² ΠΈ арифмСтичСских ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π² сцСнариях.

Π—Π°ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π·Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅


Π’ этой Π³Π»Π°Π²Π΅ ΠΌΡ‹ рассмотрСли нСсколько ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΡ‚ΡŒΡΡ Π² процСссС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сцСнариСв. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Ρ‚Π°ΠΊΠΈΡ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ нСсоизмСримо большС. ΠŸΡ€ΠΈΠ΅ΠΌΡ‹, описанныС здСсь, ΠΏΠΎΠΌΠΎΠ³ΡƒΡ‚ Π²Π°ΠΌ Π² поискС Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ распространСнных Π²ΠΈΠ΄ΠΎΠ² ошибок. ΠžΡ‚Π»Π°Π΄ΠΊΠ° β€” это искусство прСдотвращСния ошибок (Π·Π° счСт постоянного тСстирования Π² Ρ…ΠΎΠ΄Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ) ΠΈ ΠΈΡ… поиска (ΠΏΡƒΡ‚Π΅ΠΌ эффСктивного использования ΠΏΡ€ΠΈΠ΅ΠΌΠΎΠ² трассировки), ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ даСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с ΠΎΠΏΡ‹Ρ‚ΠΎΠΌ.

31. Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ выполнСния: Π²Π΅Ρ‚Π²Π»Π΅Π½ΠΈΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ case


Π’ этой Π³Π»Π°Π²Π΅ ΠΌΡ‹ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΠΌ знакомство с инструмСнтами управлСния ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ выполнСния. Π’ Π³Π»Π°Π²Π΅ 28 ΠΌΡ‹ сконструировали простоС мСню ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π»ΠΈ Π»ΠΎΠ³ΠΈΠΊΡƒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π²Ρ‹Π±ΠΎΡ€Π° Π΅Π³ΠΎ ΠΏΡƒΠ½ΠΊΡ‚ΠΎΠ² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ. Для этого использовалась сСрия ΠΊΠΎΠΌΠ°Π½Π΄ if, Π²Ρ‹ΡΡΠ½ΡΡŽΡ‰ΠΈΡ…, ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠ· Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² Π²Ρ‹Π±Ρ€Π°Π½. Π’Π°ΠΊΠΈΠ΅ конструкции часто ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ…, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ Ρ‚Π°ΠΊ часто, Ρ‡Ρ‚ΠΎ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… языках программирования (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΡƒΡŽ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΡƒ) Π±Ρ‹Π» Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ управлСния ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ выполнСния для случаСв с мноТСством Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ².

case


Командная ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ° bash ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΡΠΎΡΡ‚Π°Π²Π½ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Π²Ρ‹Π±ΠΎΡ€Π° ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ², которая называСтся case. Она ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ синтаксис:

case слово in

[шаблон [| шаблон]...) ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ;;]...

esac

ВзглянитС Π΅Ρ‰Π΅ Ρ€Π°Π·, ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° read-menu ΠΈΠ· Π³Π»Π°Π²Ρ‹ 28 ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Π²Ρ‹Π±ΠΎΡ€ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ:

#!/bin/bash

# read-menu: ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²Ρ‹Π²ΠΎΠ΄Π° систСмной ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ,

# управляСмая с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ мСню

clear

echo "

Please Select:

1. Display System Information

2. Display Disk Space

3. Display Home Space Utilization

0. Quit

"

read -p "Enter selection [0-3] > "

if [[ $REPLY =~ ^[0-3]$ ]]; then

if [[ $REPLY == 0 ]]; then

echo "Program terminated."

exit

fi

if [[ $REPLY == 1 ]]; then

echo "Hostname: $HOSTNAME"

uptime

exit

fi

if [[ $REPLY == 2 ]]; then

df -h

exit

fi

if [[ $REPLY == 3 ]]; then

if [[ $(id -u) -eq 0 ]]; then

echo "Home Space Utilization (All Users)"

du -sh /home/*

else

echo "Home Space Utilization ($USER)"

du -sh $HOME

fi

exit

fi

else

echo "Invalid entry." >&2

exit 1

fi

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ case ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π»ΠΎΠ³ΠΈΠΊΡƒ Π²Ρ‹Π±ΠΎΡ€Π° Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΡ‰Π΅:

#!/bin/bash

# case-menu: ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²Ρ‹Π²ΠΎΠ΄Π° систСмной ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ,

# управляСмая с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ мСню

clear

echo "

Please Select:

1. Display System Information

2. Display Disk Space

3. Display Home Space Utilization

0. Quit

"

read -p "Enter selection [0-3] > "

case $REPLY in

0) echo "Program terminated."

exit