Как да отстраните грешки в bash скрипт?

How Debug Bash Script




Всяка програма трябва да бъде без грешки, преди да достигне до потребителите. Разработчиците на софтуер се опитват да направят софтуерните програми без грешки. Но е трудно да се направи код безупречен, когато има хиляди редове. Отстраняването на грешки е непрекъснат процес; помага за незабавно откриване на грешки, събиране на ценна информация за кода и премахване на излишните парчета код.

Всички езици за програмиране имат някои общи и малко различни подходи за намиране на грешки. Например, програми за отстраняване на грешки могат да се използват за бързо премахване на грешки. Като има предвид, че скриптовете на черупките нямат специален инструмент за отстраняване на грешки в кода. Това писане е за обсъждане на различни техники за отстраняване на грешки, които могат да се използват, за да се направи bash скрипт без грешки. Преди да се потопим в методите, нека да имаме основно разбиране за черупките и скриптовете на черупките:







Какво представлява черупката в Linux?

Когато стартирате компютъра си, ядрото получава информация за прикачения хардуер и позволява на други свързани компоненти да взаимодействат. Отделно от това, той управлява паметта, процесора и разпознава всяка нова периферия. Като цяло ядрото е гръбнакът на всяка операционна система. Но мислили ли сте някога да взаимодействате директно с ядрото, да му заповядате да изпълни определена задача? Възможно ли е изобщо да се направи това? Абсолютно! С помощта на черупка, компютърна програма с интерактивен интерфейс, всеки може да управлява ядрото. Черупката позволява на хората да взаимодействат с ядрото и да я инструктират да изпълнява всяка задача.



В Unix има две основни черупки Черупката на Борн и C черупка . И двата типа имат своите подкатегории. Различни видове черупки на Борн са Корн черупка (ksh), черупка на Алмквист (пепел), черупка на Борн отново (bash), и Z обвивка (zsh) . В същото време, черупката C има свои собствени подкатегории като C черупка (csh) и TENEX C черупка (tcsh) . Както бе споменато по -горе, от всички черупки, Баш (черупка на Борн отново) е най-широко използваната обвивка и излиза от кутията в много дистрибуции на Linux поради своята ефективност и удобство за потребителя.



Bash е обвивката по подразбиране на много дистрибуции на Linux и се използва широко от милиони потребители на Linux. То е толкова разнообразно и влиятелно, че може да изпълнява всяка задача, която обикновено изпълнявате в приложения, базирани на GUI. Можете да редактирате файлове, да управлявате файлове, да преглеждате снимки, да слушате музика, да възпроизвеждате видеоклипове и много други.





Какво е Shell Script:

Тъй като научихме основната идея за черупка, сега нека преминем към скриптове на черупки. Скриптът на черупката е компютърна програма, която изпълнява множество команди в черупка, която действа като интерпретатор за изпълнение на определена функция. Както беше обсъдено по -горе, има 2 конкретни вида черупки. Това ръководство обаче се фокусира върху черупката на Bourne Again (Bash).
И така, какво е bash скрипт? В Linux всички команди bash се съхраняват в /usr /bin и /bin папки. Например, когато изпълнявате команда, bash търси дали тя съществува в директорията или не. Командата се изпълнява, ако намери в директориите, иначе дава грешка.

Какво ще кажете за изпълнение на задача, която се нуждае от множество команди за изпълнение в терминала? В тази конкретна ситуация bash скриптовете могат да ви помогнат. Bash скриптове са форма на скриптове на черупки, които ви позволяват да правите програми да изпълняват множество bash команди за изпълнение на конкретна задача.



Какви са грешките в bash скриптове:

Докато работите с bash скриптове или с други езици за програмиране, срещате много грешки. Грешка е грешка или грешка в програмата, която може да доведе до неправилно поведение на програмата.

Всеки език за програмиране има своя собствена процедура за намиране на грешки; по същия начин, bash също има много вградени опции за отстраняване на грешки в терминална програма.

Управлението на грешки и отстраняването на грешки в програма е не по -малко от караница. Това отнема много време и може да се влоши, ако не знаете правилните инструменти за отстраняване на грешки в програмата. Това писане е пълно ръководство за отстраняване на грешки в bash-скриптове, за да направите вашия скрипт без грешки. Така че нека започнем:

Как да отстраните грешки в bash скрипт:

Когато работите по големи програмни проекти, срещате много грешки или грешки. Отстраняването на грешки в програма понякога може да бъде сложно. Програмистите обикновено използват инструменти за отстраняване на грешки и много редактори на кодове също помагат при намирането на грешки, като подчертават синтаксиса.

В Linux има различни инструменти за отстраняване на грешки в кодове, например GNU Debugger известен още като gdb. Инструменти като GDB са полезни за езици за програмиране, които се компилират в двоични файлове. Тъй като bash е прост интерпретиран език, няма нужда от тежки инструменти за отстраняването му.

Има различни традиционни техники за отстраняване на грешки в скриптов код на bash и една от тях е добавянето Твърдения. Твърденията са условия, които се добавят в програмите, за да се проверят конкретни условия и съответно да се изпълни програмата. Това е защитна техника, която помага и при намирането на грешки и тестването. Можете да намерите много инструменти които помагат при добавянето на твърдения в bash скриптове.

Е, добавянето на твърдения е една от старите традиционни техники. В bash има набори от флагове/опции за отстраняване на грешки в bash скрипт. Тези опции могат да бъдат добавени заедно с shebang в скриптовете или добавени при изпълнение на програмата в терминала. Темите, които ще разгледаме, са изброени по -долу:

  1. Как да отстраните грешки в bash script, като активирате многословен -v опция
  2. Как да отстраните грешки в bash скрипт с помощта xtrace -x опция
  3. Как да отстраните грешки в bash скрипт с помощта noexec -n опция
  4. Как да идентифицираме неустановени променливи при отстраняване на грешки в bash скрипт
  5. Как да отстраните грешки в конкретна част на bash скрипта
  6. Как да отстраните грешки в bash скрипт с помощта на капан команда
  7. Как да отстраните грешки в bash скрипт, като елиминирате глобиране на файлове използвайки -f опция
  8. Как да комбинирам опции за отстраняване на грешки за отстраняване на грешки в скрипт на черупка
  9. Как да redirect debug-report към файл

Така че нека проверим различни техники в bash, за да отстраним грешки в bash скрипт:

1. Как да отстраните грешки в bash скрипт, като активирате опцията verbose -v:

Един от най -лесните подходи за отстраняване на грешки в скрипта bash е използването на -v опция, известна още като многословна. Опцията може да се добави с shebang или изрично да се постави с името на файла на скрипта, докато се изпълнява. Подробната опция ще изпълни и отпечата всеки ред от кода като процес от интерпретатора. Нека го разберем с пример на bash скрипт:

#! /bin/bash
изхвърлен „Въведете номер 1“
Прочетиномер 1
изхвърлен „Въведете номер 2“
Прочетиномер 2
ако [ '$ номер 1' -gt '$ номер 2' ]
тогава
изхвърлен „Номер 1 е по -голям от номер 2“
elif [ '$ номер 1' -екв '$ номер 2' ]
тогава
изхвърлен „Число 1 е равно на число 2“
иначе
изхвърлен „Номер 2 е по -голям от номер 1“
бъда

Горният код получава две числа от потребителя и след това изпълнява някои условни изявления, за да провери дали числото е по -значимо, по -малко или равно на другото въведено число. Въпреки че всеки текстов редактор може да се използва за bash скриптове, аз използвам Vim редактор. Vim е мощен, богат на функции редактор, който подчертава синтаксиса на bash скриптове и намалява шансовете за синтаксични грешки. Ако нямате редактор Vim, вземете го, като изпълните командата, спомената по -долу:

$sudoподходящИнсталирай дойдох

Създайте bash скрипт файл, като използвате:

$дойдохb_script.sh

Ако сте нов в редактора на Vim, препоръчвам ви да научите как да използвате редактора vim преди да продължите.

Сега, обратно към скрипта, изпълнете скрипта, като използвате -v опция:

$баш -vb_script.sh

В горния изход може да се види, че всеки ред на скрипта се отпечатва в терминала, докато се обработва от интерпретатора. Обърнете внимание, че скриптът ще спре да приема данни от потребителя и след това ще обработи следващия ред на скрипта. Както беше обсъдено по -горе, че -v опцията може да бъде поставена след shebang, както е показано на следното:

#! / bin / bash -v

По същия начин многословният флаг може да бъде добавен и в следващия ред на shebang с помощта на комплект команда:

#! /bin/bash
комплект -v

Всеки от методите, обсъдени по -горе, може да даде възможност за многословен.

2 Как да отстраните грешки в bash скрипт, използвайки опцията xtrace -x:

Проследяването на изпълнение, известно още като xtrace, е интелигентна и полезна опция за отстраняване на грешки, особено за проследяване на логически грешки. Логическите грешки обикновено се свързват с променливи и команди. За да проверим състоянието на променливата по време на изпълнение на скрипта, използваме опция. Сега отново стартирайте b_script.sh файл с флаг:

$баш b_script.sh

Изходът изрично показва стойността на всяка променлива по време на процеса на изпълнение. Отново, може да се използва до шебанга и след линията шебанг с помощта на командата set. Xtrace поставя знака + с всеки ред на скрипта.

3 Как да отстраните грешки в bash скрипт, използвайки опцията noexec -n:

Синтаксичните грешки са една от основните причини за грешки. За синтактично отстраняване на грешки на скрипта bash използваме noexec режим (без изпълнение). Опцията, използвана за режим noexec, е -н. Той ще показва само синтаксичните грешки на кода, вместо да го изпълнява. Много по -безопасен подход за отстраняване на грешки в кода. Нека изпълним b_script.sh отново с опция:

$баш b_script.sh

Няма да има изпълнение на код, ако няма синтаксична грешка. Сега нека променим нашия код:

#! /bin/bash

изхвърлен „Въведете номер 1“
Прочетиномер 1
изхвърлен „Въведете номер 2“
Прочетиномер 2
ако [ '$ номер 1' -gt '$ номер 2' ]
тогава
изхвърлен „Номер 1 е по -голям от номер 2“
elif [ '$ номер 1' -екв '$ номер 2' ]
#тогава
изхвърлен „Число 1 е равно на число 2“
иначе
изхвърлен „Номер 2 е по -голям от номер 1“
бъда

Коментирам тогава след elif . Сега с -n execute b_script.sh скрипт:

$баш b_script.sh

Както се очакваше, той ясно идентифицира грешката и я показва в терминала.

4 Как да идентифицирате неустановените променливи, докато отстранявате грешки в bash скрипт:

Правенето на печатна грешка при писане на код е често срещано явление. Често грешно въвеждате променлива, която не позволява изпълнението на кода. За да идентифицираме такава грешка, използваме -u опция. Нека променим кода отново:

#! /bin/bash
изхвърлен „Въведете номер 1“
Прочетиномер 1
изхвърлен „Въведете номер 2“
Прочетиномер 2
ако [ '$ num1' -gt '$ номер 2' ]
тогава
изхвърлен „Номер 1 е по -голям от номер 2“
elif [ '$ номер 1' -екв '$ номер 2' ]
тогава
изхвърлен „Число 1 е равно на число 2“
иначе
изхвърлен „Номер 2 е по -голям от номер 1“
бъда

В първия ако условно изявление, преименувах на номер 1 променлива към номер1 . Сега номер1 е неустановена променлива. Сега стартирайте скрипта:

$баш -ub_script.sh

Изходът е идентифицирал и изрично показва името на неустановена променлива.

5. Как да отстраните грешките в конкретната част от скрипта bash:

Режимът xtrace обработва всеки ред от кода и дава изход. Намирането на грешки в голям код обаче би отнело много време, ако вече знаем коя част потенциално причинява грешката. За щастие, xtrace също ви позволява да отстранявате грешки в определена част от кода, което може да бъде постигнато с помощта на комплект команда. Място набор -x в началото на частта, която трябва да бъде отстранена и след това набор +x накрая. Например, искам да отстраня грешките на условните изявления на b_script.sh , така че ще приложа всички условни изявления в набор -x и набор +x опции, както е показано в кода по -долу:

#! /bin/bash
изхвърлен „Въведете номер 1“
Прочетиномер 1
изхвърлен „Въведете номер 2“
Прочетиномер 2
комплект
ако [ '$ номер' -gt '$ номер 2' ]
тогава
изхвърлен „Номер 1 е по -голям от номер 2“
elif [ '$ номер 1' -екв '$ номер 2' ]
тогава
изхвърлен „Число 1 е равно на число 2“
иначе
изхвърлен „Номер 2 е по -голям от номер 1“
бъда
комплект+ x

Сега стартирайте скрипта с помощта bash b_script.sh .

Изходът отстранява грешки само при условията if, както е посочено.

6. Как да отстраните грешки в bash скрипт с помощта на командата trap:

Ако скриптът ви е сложен, има и по -сложни техники за отстраняване на грешки. Един от тях е капан команда. The капан команда улавя сигналите и изпълнява команда, когато възникне конкретна ситуация. Командата може да бъде сигнал или функция. Създадох друг скрипт на името на sum_script.sh :

#! /bin/bash
капан 'echo' Line $ {LINENO}: Първото число е $ number1, Второто число е $ number2 и сумата е $ sum ''ДЕБУГ
изхвърлен „Въведете първо число“
Прочетиномер 1
изхвърлен „Въведете втори номер“
Прочетиномер 2
сума= $[номер1 + номер2]
изхвърлен 'сумата е$ сума'

The капан команда с ДЕБУГ сигнал показва състоянието на променливите номер 1 , номер 2 и сума след изпълнението на всеки ред, както е показано на следното изходно изображение:

Жълтите блокове са празни пространства, тъй като потребителят все още не е въвел въвеждане; тези пространства ще се запълнят, когато потребителят въвежда стойности. Този метод също е доста полезен при отстраняване на грешки в bash скриптове.

7. Как да отстраните грешки в bash скрипт, като премахнете глобулирането на файлове с помощта на опцията -f:

Глобирането на файлове е процес на намиране на файлове с заместващи знаци, т.е. * и ? . В много ситуации не е необходимо да разширявате файлове по време на отстраняване на грешки. В такива случаи можете да блокирате глобирането на файлове с помощта на -f опция. Нека го разберем със скрипт fglobe_script.sh :

#! /bin/bash
изхвърлен 'Показване на всички текстови файлове.'
ls *.текст

Горният код ще покаже всички текстови файлове в текущата директория, изпълнете:

$башfglobe_script.sh

За да изключите глобирането на файлове, използвайте -f опция:

$баш -ffglobe_script.sh

По същия начин можете да го използвате с шебанга и с комплект команда също:

#! /bin/bash
изхвърлен 'Показване на всички текстови файлове.'
ls *.текст
комплект -f
изхвърлен „Показване на всички текстови файлове“
ls *.текст
комплект+f

А сега бягай bash fglobe_script.sh:

Частта, затворена с set -f/set +f options не обработва команди с заместващи знаци.

8. Как да комбинирате опциите за отстраняване на грешки в скрипта за отстраняване на грешки:

Използваме само една опция в гореспоменатите техники за отстраняване на грешки, но можем да комбинираме различни опции за по-добро разбиране. Нека да приложим и -v опции към sum_script.sh скрипт. Аз използвам sum_script.sh скрипт.

#! /bin/bash
изхвърлен „Въведете първо число“
Прочетиномер 1
изхвърлен „Въведете втори номер“
Прочетиномер 2
сума= $[номер1 + номер2]
изхвърлен 'сумата е$ сума'

Сега изпълнете:

$баш -xvsum_script.sh

И двете и -v изходите се комбинират, както е показано на изходното изображение. По подобен начин можем да комбинираме и -u опция с подробен -v за откриване на грешки. Заменям номер 1 променлива с никой в шестия ред на скрипта:

#! /bin/bash
е$ номер 2исумае$ сума'' ДЕБУГ
изхвърлен '
Въведете първото число'
прочетете номер 1
изхвърлен '
Въведете втори номер'
прочетете номер 2
сума = $ [номер + число2]
изхвърлен '
насумае$ сума'

За да видите изхода, изпълнете следната команда:

$баш -увsum_script.sh

9. Как да пренасочите debug-report към файл:

Запазването на отчет за отстраняване на грешки на bash скрипт във файл може да бъде полезно в много ситуации. Това е малко сложно, защото за пренасочване на дебъг-отчет към файл; използваме някои специални променливи. Нека го приложим b_script.sh код:

#! /bin/bash
exec 5>dubug_report.log
BASH_XTRACED='5'
PS4='$ LINENO--'
изхвърлен „Въведете номер 1“
Прочетиномер 1
изхвърлен „Въведете номер 2“
Прочетиномер 2
ако [ '$ номер' -gt '$ номер 2' ]
тогава
изхвърлен „Номер 1 е по -голям от номер 2“
elif [ '$ номер 1' -екв '$ номер 2' ]
тогава
изхвърлен „Число 1 е равно на число 2“
иначе
изхвърлен „Номер 2 е по -голям от номер 1“
бъда

Във втория ред на кода може да се види, че пренасочваме изхода към a debug_report.log файл с помощта на exec команда с дескриптор на файл 5 (FD5).

exec 5> debug_report.log: The exec командата пренасочва всичко, което се случва в черупката към файл debug_report.log.

BASH_XTRACEFD = 5: Това е конкретна променлива bash и не може да се използва в друга обвивка. Трябва да му бъде присвоен валиден файлов дескриптор и bash ще запише извлечения изход в debug_report.log.

PS4 = '$ LINENO– ‘: Това също е променлива bash, използвана за отпечатване на номера на ред при отстраняване на грешки в режим xtrace. Стойността по подразбиране на PS4 е + знак

Горният скрипт генерира регистрационен файл, наречен debug_report.log, за да го прочетете, използвайте котка команда:

Заключение:

Код, пълен с грешки, може да повлияе на работата на програмата и да навреди на хардуера. Отстраняването на грешки е много важно за всяка програма, тъй като прави програмата по -ефективна. Намирането на съществуващи и потенциални грешки по време на разработването на програма може да попречи на програмата ви да се държи неочаквано. Големите кодове обикновено се нуждаят от активно отстраняване на грешки, повишавайки ефективността на кода, като елиминират регреса, който поема парчета код.

Много езици за програмиране и среди имат свои собствени програми за отстраняване на грешки. В bash скриптове могат да бъдат приложени различни техники за отстраняване на грешки в скрипта. Това ръководство се фокусира изцяло върху всички методи, които могат да се използват за намиране на грешки в скриптовете bash. Така че, когато почувствате, че вашият bash скрипт не се държи както се очаква, използвайте някоя от споменатите по-горе техники, но режим xtrace (-x) е доста полезен в повечето случаи.