Com depurar un script bash?

How Debug Bash Script




Cal que qualsevol programa estigui lliure d’errors abans que arribi als consumidors. Els desenvolupadors de programari fan tot el possible per fer que els programes de programari siguin lliures d'errors. Però és difícil fer que un codi sigui impecable quan hi ha milers de línies. La depuració és un procés continu; ajuda a detectar immediatament els errors, recopilar informació valuosa sobre el codi i eliminar trossos de codi redundants.

Tots els llenguatges de programació tenen alguns enfocaments comuns i pocs diferents per trobar errors. Per exemple, els programes de depuració es poden utilitzar per eliminar els errors ràpidament. Mentre que les seqüències d’ordres no tenen cap eina particular per depurar el codi. Aquesta redacció tracta de discutir diverses tècniques de depuració que es poden utilitzar per fer que l'script bash estigui lliure d'errors. Abans d’endinsar-nos en els mètodes, coneixem bàsicament els intèrprets d’ordres i les seqüències d’ordres:







Què és l'intèrpret d'ordres a Linux?

En arrencar l’ordinador, el nucli obté informació sobre el maquinari connectat i permet que altres components connectats interaccionin. A part, gestiona la memòria, la CPU i reconeix qualsevol nou perifèric. Amb tot, un nucli és l’eix vertebrador de qualsevol sistema operatiu. Però, heu pensat alguna vegada a interactuar directament amb el nucli i ordenar-li que realitzi una tasca específica? Fins i tot és factible fer-ho? Absolutament! Amb l'ajut d'un intèrpret d'ordres, un programa d'ordinador amb una interfície interactiva, qualsevol pot operar el nucli. El shell permet als humans interactuar amb el nucli i indicar-li que realitzi qualsevol tasca.



A Unix, hi ha dues petxines principals Petxina Bourne i C petxina . Tots dos tipus tenen les seves subcategories. Hi ha diferents tipus de petxines Bourne Korn shell (ksh), Almquist shell (freixe), Bourne de nou shell (bash), i Z shell (zsh) . Al mateix temps, l'intèrpret d'ordres C té les seves pròpies subcategories, com ara C shell (csh) i Carcassa TENEX C. (tcsh) . Com s'ha esmentat anteriorment, de totes les petxines, Bash (Bourne de nou shell) és l'intèrpret d'ordres més utilitzat i surt de la caixa en moltes distribucions de Linux per la seva eficiència i facilitat d'ús.



Bash és l'intèrpret d'ordres predeterminat de moltes distribucions de Linux i és utilitzat àmpliament per milions d'usuaris de Linux. És tan divers i influent que pot realitzar totes les tasques que realitzeu normalment en aplicacions basades en GUI. Podeu editar fitxers, gestionar fitxers, veure fotos, escoltar música, reproduir vídeos i molt més.





Què és un script Shell:

A mesura que hem après la idea bàsica de l'intèrpret d'ordres, ara anem cap a les seqüències de comandaments de l'intèrpret d'ordres. L'escript de l'intèrpret d'ordres és un programa d'ordinador que executa diverses ordres en un intèrpret d'ordres que actua com a intèrpret per realitzar una funció específica. Com s'ha comentat anteriorment, hi ha 2 tipus particulars de petxines. No obstant això, aquesta guia se centra en el shell Bourne Again (Bash).
Llavors, què és un script bash? A Linux, s’emmagatzemen totes les ordres bash / usr / bin i / bin carpetes. Per exemple, sempre que executeu una ordre, busqueu si existeix o no al directori. L'ordre s'executa si es troba als directoris, en cas contrari es produeix un error.

Què tal si realitzeu una tasca que necessita diverses ordres per executar-se al terminal? En aquesta situació específica, els scripts bash us poden ajudar. El script Bash és una forma de shell script que us permet crear programes per executar diverses ordres bash per realitzar una tasca específica.



Què són els errors dels scripts bash:

Mentre treballeu amb bash scripting o amb qualsevol altre llenguatge de programació, trobareu molts errors. Un error és un error o un error al programa que pot fer que el programa es comporti incorrectament.

Cada llenguatge de programació té el seu propi procediment per trobar errors; de la mateixa manera, bash també té moltes opcions integrades per depurar un programa de terminal.

Gestionar els errors i depurar un programa no és menys que una molèstia. És una feina que consumeix molt de temps i pot empitjorar si no coneixeu les eines adequades per depurar el vostre programa. Aquesta redacció és una guia completa sobre la depuració de bash-scripts per fer que el vostre script no tingui errors. Comencem, doncs:

Com depurar un script bash:

Quan treballeu en grans projectes de programació, trobeu molts errors o errors. La depuració d’un programa de vegades pot ser complicada. Els programadors solen utilitzar eines de depuració, i molts editors de codi també ajuden a trobar errors ressaltant la sintaxi.

Hi ha diverses eines a Linux per depurar codis, per exemple, el depurador GNU també conegut com gdb. Eines com GDB són útils per a llenguatges de programació que es compilen en binaris. Com que bash és un llenguatge interpretat senzill, no cal fer servir eines pesades per depurar-lo.

Hi ha diverses tècniques tradicionals per depurar un codi de script bash, i una d'elles és afegir Afirmacions. Les afirmacions són condicions que s’afegeixen als programes per comprovar condicions específiques i executar el programa en conseqüència. És una tècnica defensiva que també ajuda a trobar errors i provar. En podeu trobar molts eines que ajuden a afegir afirmacions en scripts bash.

Bé, afegir afirmacions és una de les velles tècniques tradicionals. Hi ha conjunts d'indicadors / opcions disponibles a bash per depurar un script bash. Aquestes opcions es poden afegir juntament amb shebang als scripts o afegir-les mentre s'executa el programa al terminal. A continuació es detallen els temes que tractarem:

  1. Com depurar script bash activant detallat -v opció
  2. Com depurar script bash mitjançant xtrace -x opció
  3. Com depurar script bash mitjançant noexec -n opció
  4. Com identificar el variables sense definir mentre es depura l'script bash
  5. Com depurar el fitxer part específica del guió bash
  6. Com depurar un script bash mitjançant el fitxer parany comandament
  7. Com depurar un script bash eliminant-lo arxius globulars utilitzant el -f opció
  8. Com combinar opcions de depuració per depurar un script d'intèrpret d'ordres
  9. Com redirigeix ​​l'informe de depuració a un fitxer

Per tant, comprovem diverses tècniques a bash per depurar un script bash:

1. Com depurar script bash activant l'opció detallada -v:

Un dels enfocaments més fàcils de depurar l'script bash és utilitzar el fitxer -v opció, també coneguda com a detallada. L'opció es pot afegir amb el shebang o posar-la explícitament amb el nom del fitxer de script mentre s'executa. L'opció detallada executarà i imprimirà totes les línies del codi com a procés de l'intèrpret. Ho entenem amb un exemple de script bash:

#! / bin / bash
trobo 'Introduïu el número 1'
llegirnúmero 1
trobo 'Introduïu el número 2'
llegirnúmero2
si [ '$ number1' -gt '$ número2' ]
llavors
trobo 'El número 1 és superior al número 2'
elif [ '$ number1' -eq '$ número2' ]
llavors
trobo 'Nombre1 és igual a Número2'
en cas contrari
trobo 'El número 2 és superior al número 1'
ser

El codi anterior obté dos números de l’usuari i després realitza algunes sentències condicionals per comprovar si el nombre és més significatiu, menor o igual a l’altre número introduït. Tot i que qualsevol editor de text es pot fer servir per a bash scripting, estic fent servir l'editor Vim. Vim és un editor potent i ric en funcions que ressalta la sintaxi dels scripts bash i redueix les possibilitats d’errors de sintaxi. Si no teniu editor Vim, obteniu-lo executant l'ordre esmentada a continuació:

$suoapteinstal·lar vaig venir

Creeu un fitxer de script bash mitjançant:

$vaig venirb_script.sh

Si no coneixeu l'editor Vim, us recomano que aprengueu com utilitzar l'editor vim abans de continuar.

Ara, de nou al script, executeu el script mitjançant -v opció:

$bash -vb_script.sh

Es pot veure a la sortida anterior que cada línia de l’escriptura s’imprimeix al terminal a mesura que l’intèrpret processa. Tingueu en compte que l'script deixarà de rebre l'entrada de l'usuari i, a continuació, processarà la següent línia de l'script. Com s'ha comentat anteriorment, el fitxer -v l'opció es pot col·locar després del shebang, tal com es mostra a continuació:

#! / bin / bash -v

De la mateixa manera, la bandera detallada també es pot afegir a la següent línia de shebang mitjançant el fitxer conjunt comandament:

#! / bin / bash
conjunt -v

Qualsevol dels mètodes comentats anteriorment pot activar els detalls.

2 Com depurar l'script bash mitjançant l'opció xtrace -x:

El rastreig d’execució, també conegut com a xtrace, és una opció de depuració intel·ligent i útil, especialment per rastrejar errors lògics. Els errors lògics solen associar-se a variables i ordres. Per comprovar l'estat de la variable durant l'execució de l'script, fem servir el fitxer -x opció. Ara, de nou, executeu el fitxer b_script.sh arxiu amb el fitxer -x bandera:

$bash -xb_script.sh

La sortida mostra explícitament el valor de cada variable durant el procés d’execució. De nou, el -x es pot utilitzar al costat del shebang i després de la línia del shebang mitjançant l'ordre set. El xtrace posa el signe + amb cada línia de l'script.

3 Com depurar l'script bash mitjançant l'opció noexec -n:

Els errors de sintaxi són una de les causes principals dels errors. Per depurar sintàcticament l’escriptura bash, fem servir noexec mode (sense execució). L'opció utilitzada per al mode noexec és -n. Només mostrarà els errors de sintaxi del codi en lloc d'executar-lo. Un enfocament molt més segur per depurar el codi. Executem b_script.sh de nou amb el -n opció:

$bash -nb_script.sh

No hi haurà cap execució de codi si no hi ha cap error de sintaxi. Ara, modificem el nostre codi:

#! / bin / bash

trobo 'Introduïu el número 1'
llegirnúmero 1
trobo 'Introduïu el número 2'
llegirnúmero2
si [ '$ number1' -gt '$ número2' ]
llavors
trobo 'El número 1 és superior al número 2'
elif [ '$ number1' -eq '$ número2' ]
# llavors
trobo 'Nombre1 és igual a Número2'
en cas contrari
trobo 'El número 2 és superior al número 1'
ser

Estic comentant llavors després elif . Ara, amb -n executa b_script.sh guió:

$bash -nb_script.sh

Com es preveia, va identificar clarament l’error i el va mostrar al terminal.

4 Com s'identifiquen les variables sense configurar mentre es depura l'script bash:

És freqüent fer una errada tipogràfica mentre s’escriu un codi. Sovint, escriviu malament una variable, que no permet que el codi s'executi. Per identificar aquest error, fem servir el fitxer -u opció. Tornem a modificar el codi:

#! / bin / bash
trobo 'Introduïu el número 1'
llegirnúmero 1
trobo 'Introduïu el número 2'
llegirnúmero2
si [ '$ num1' -gt '$ número2' ]
llavors
trobo 'El número 1 és superior al número 2'
elif [ '$ number1' -eq '$ número2' ]
llavors
trobo 'Nombre1 és igual a Número2'
en cas contrari
trobo 'El número 2 és superior al número 1'
ser

A la primera si declaració condicional, he canviat el nom de número 1 variable a num1 . Ara num1 és una variable no configurada. Ara executeu l'script:

$bash -ub_script.sh

La sortida ha identificat i mostra explícitament el nom d'una variable sense definir.

5. Com depurar la part específica de l'script bash:

El mode xtrace processa totes les línies del codi i dóna sortida. Tot i això, trobar errors en un codi gran trigaria si ja sabem quina part pot causar l’error. Afortunadament, xtrace també us permet depurar una part específica del codi, que es pot fer mitjançant el fitxer conjunt comandament. Lloc set -x al començament de la part que cal depurar i després set + x al final. Per exemple, vull depurar les declaracions condicionals de b_script.sh , per tant, inclouré totes les afirmacions condicionals a set -x i set + x opcions tal com es mostra al codi següent:

#! / bin / bash
trobo 'Introduïu el número 1'
llegirnúmero 1
trobo 'Introduïu el número 2'
llegirnúmero2
conjunt -x
si [ '$ número' -gt '$ número2' ]
llavors
trobo 'El número 1 és superior al número 2'
elif [ '$ number1' -eq '$ número2' ]
llavors
trobo 'Nombre1 és igual a Número2'
en cas contrari
trobo 'El número 2 és superior al número 1'
ser
conjunt+ x

Ara, executeu l'script amb bash b_script.sh .

La sortida només depura les condicions si s’especifica.

6. Com depurar un script bash mitjançant l'ordre trap:

Si el vostre script és complicat, també hi ha tècniques més elaborades per a la depuració. Un d’ells és el parany comandament. El parany L'ordre capta els senyals i executa una ordre quan es produeix una situació específica. L'ordre pot ser un senyal o una funció. He creat un altre script amb el nom de sum_script.sh :

#! / bin / bash
parany Línia 'echo' $ {LINENO}: el primer número és $ number1, el segon número és $ number2 i la suma és $ suma ''DEBUG
trobo 'Introduïu el primer número'
llegirnúmero 1
trobo 'Introduïu el segon número'
llegirnúmero2
suma= $[número1 + número2]
trobo 'la suma és$ suma'

El parany ordre amb DEBUG el senyal mostra l'estat de les variables número 1 , número2 i suma després de l'execució de cada línia, tal com es mostra a la imatge de sortida següent:

Els blocs grocs són espais en blanc perquè l'usuari encara no ha introduït cap entrada; aquests espais s’ompliran a mesura que l’usuari introdueixi valors. Aquest mètode també és molt útil per depurar scripts bash.

7. Com depurar un script bash eliminant el bloqueig de fitxers mitjançant l'opció -f:

La captació de fitxers és un procés de cerca de fitxers amb caràcters comodins, és a dir, * i ? . En moltes situacions, no cal ampliar fitxers mentre es depura. En aquests casos, podeu bloquejar el fitxer globular mitjançant el fitxer -f opció. Ho entenem amb un guió fglobe_script.sh :

#! / bin / bash
trobo 'Mostra tots els fitxers de text.'
ls *.txt

El codi anterior mostrarà tots els fitxers de text al directori actual, executeu:

$bashfglobe_script.sh

Per desactivar la captació de fitxers, utilitzeu el fitxer -f opció:

$bash -ffglobe_script.sh

De la mateixa manera, podeu utilitzar-lo amb el shebang i amb el conjunt ordre també:

#! / bin / bash
trobo 'Mostra tots els fitxers de text.'
ls *.txt
conjunt -f
trobo 'Mostra tots els fitxers de text'
ls *.txt
conjunt+ f

Ara, corre bash fglobe_script.sh:

La porció inclosa amb set -f / set + f Les opcions no processaven ordres amb caràcters comodins.

8. Com es combinen les opcions de depuració per depurar l'script de l'intèrpret d'ordres:

Utilitzem només una opció a les tècniques de depuració esmentades, però podem combinar diverses opcions per a una millor comprensió. Implementem -x i -v opcions al fitxer sum_script.sh guió. Estic fent servir el fitxer sum_script.sh guió.

#! / bin / bash
trobo 'Introduïu el primer número'
llegirnúmero 1
trobo 'Introduïu el segon número'
llegirnúmero2
suma= $[número1 + número2]
trobo 'la suma és$ suma'

Ara executeu:

$bash -XVsum_script.sh

Tots dos -x i -v les sortides es combinen, tal com es mostra a la imatge de sortida. De la mateixa manera, també podem combinar el fitxer -u opció amb detall -v per a la detecció d'errors. Estic substituint el fitxer número 1 variable amb en un a la sisena línia del guió:

#! / bin / bash
és$ número2isumaés$ suma'' DEBUG
echo '
Introduïu el primer número'
llegir el número 1
echo '
Introduïu el segon número'
llegiu el número 2
suma = $ [num + número2]
echo '
elsumaés$ suma'

Per veure la sortida, executeu l'ordre esmentada a continuació:

$bash -uvsum_script.sh

9. Com redirigir l'informe de depuració a un fitxer:

Desar un informe de depuració d’un script bash en un fitxer pot ser útil en moltes situacions. És una mica complicat perquè redirigir l'informe de depuració a un fitxer; fem servir algunes variables especials. Posem-ho en pràctica b_script.sh codi:

#! / bin / bash
exec 5>dubug_report.log
BASH_XTRACED='5'
PS4='$ LINENO--'
trobo 'Introduïu el número 1'
llegirnúmero 1
trobo 'Introduïu el número 2'
llegirnúmero2
si [ '$ número' -gt '$ número2' ]
llavors
trobo 'El número 1 és superior al número 2'
elif [ '$ number1' -eq '$ número2' ]
llavors
trobo 'Nombre1 és igual a Número2'
en cas contrari
trobo 'El número 2 és superior al número 1'
ser

A la segona línia del codi, es pot veure que estem redirigint la sortida a debug_report.log mitjançant el fitxer exec ordre amb el descriptor de fitxer 5 (FD5).

exec 5> debug_report.log: El exec L'ordre està redirigint tot el que passa a l'intèrpret d'ordres a un fitxer debug_report.log.

BASH_XTRACEFD = 5: És un variable bash particular i no es pot utilitzar en cap altre intèrpret d'ordres. Cal assignar-li un descriptor de fitxer vàlid i bash escriurà la sortida extreta debug_report.log.

PS4 = ’$ LINENO– ‘: També és una variable bash que s’utilitza per imprimir el número de línia mentre es depura mitjançant el mode xtrace. El valor per defecte de PS4 és el + signe

L'escriptura anterior genera un fitxer de registre anomenat debug_report.log, per llegir-lo, utilitzeu el fitxer gat comandament:

Conclusió:

Un codi ple d’errors també pot afectar el rendiment del programa i perjudicar el maquinari. La depuració és molt crucial per a cada programa, ja que fa que el programa sigui més eficient. Trobar errors existents i potencials durant el desenvolupament d’un programa pot evitar que el programa es comporti de manera inesperada. Els codis grans solen necessitar una depuració activa, cosa que millora l’eficàcia del codi eliminant els recursos que consumeixen trossos de codi.

Molts llenguatges i entorns de programació tenen els seus propis depuradors complementaris. En bash scripting, es poden implementar diverses tècniques per depurar el script. Aquesta guia es va centrar a fons en tots els mètodes que es poden utilitzar per trobar errors als scripts bash. Per tant, sempre que creieu que el vostre script bash no es comporta com s’esperava, utilitzeu alguna de les tècniques esmentades anteriorment, però el mode xtrace (-x) és força útil en la majoria dels casos.