Comment tracer l'exécution des commandes dans le script shell avec le traçage de la coquille

Comment tracer l'exécution des commandes dans le script shell avec le traçage de la coquille

Dans cet article de la série de débogage du script de shell, nous expliquerons le troisième mode de débogage du script de shell, c'est-à-dire le traçage des shell et examineront quelques exemples pour démontrer comment cela fonctionne et comment il peut être utilisé.

La partie précédente de cette série met clairement la lumière sur les deux autres modes de débogage de script shell: mode verbeux et Vérification de la syntaxe Mode avec des exemples faciles à comprendre comment permettre le débogage du script shell dans ces modes.

  1. Comment activer le mode de débogage du script shell dans Linux - partie 1
  2. Comment effectuer le mode de débogage de vérification de la syntaxe dans les scripts shell - partie 2

Le traçage de la coquille signifie simplement tracer l'exécution des commandes dans un script shell. Pour allumer le traçage de la coque, utilisez le -X option de débogage.

Cela ordonne au shell d'afficher toutes les commandes et leurs arguments sur le terminal lorsqu'ils sont exécutés.

Nous utiliserons le sys_info.shot Script Shell ci-dessous, qui imprime brièvement la date et l'heure du système, le nombre d'utilisateurs s'est connecté et la disponibilité du système. Cependant, il contient des erreurs de syntaxe que nous devons trouver et corriger.

#!/ bin / bash #script pour imprimer les informations brèves d'informations système root_id = "0" date = "date" no_users = "who | wc -l" uptime = "uptime" check_root () if ["$ uid" -ne "$ root_id "]; puis écho "Vous n'êtes pas autorisé à exécuter ce programme!"Exit 1; print_sys_info () echo" Heure du système: $ date "echo" Nombre d'utilisateurs: $ no_users "echo" Uptime du système: $ Uptime check_root print_sys_info exit 0 

Enregistrer le fichier et rendre l'exécutable de script. Le script ne peut être exécuté que par root, utilisez donc la commande sudo pour l'exécuter comme ci-dessous:

$ chmod + x sys_info.sh $ sudo bash -x sys_info.shot 
Shell Traçage - Afficher l'erreur dans le script

De la sortie ci-dessus, nous pouvons observer que, une commande est d'abord exécutée avant que sa sortie ne soit remplacée comme la valeur d'une variable.

Par exemple, le date a été exécuté pour la première fois et sa sortie a été remplacée comme la valeur de la variable DATE.

Nous pouvons effectuer la vérification de la syntaxe pour afficher uniquement les erreurs de syntaxe comme suit:

$ sudo bash -n sys_info.shot 
Syntaxe vérifiant le script

Si nous regardons le script de shell de manière critique, nous réaliserons que le Si déclaration manque une fermeture Fi mot. Par conséquent, ajoutons-le et le nouveau script devrait maintenant ressembler ci-dessous:

#!/ bin / bash #script pour imprimer les informations brèves d'informations système root_id = "0" date = "date" no_users = "who | wc -l" uptime = "uptime" check_root () if ["$ uid" -ne "$ root_id "]; puis écho "Vous n'êtes pas autorisé à exécuter ce programme!"Exit 1; fi print_sys_info () echo" Heure du système: $ date "echo" Nombre d'utilisateurs: $ no_users "echo" Uptime du système: $ Uptime check_root print_sys_info exit 0 

Enregistrez à nouveau le fichier et appelez-le comme racine et effectuez une vérification de la syntaxe:

$ sudo bash -n sys_info.shot 
Effectuer la syntaxe Vérifier les scripts shell

Le résultat de notre opération de vérification de syntaxe ci-dessus montre toujours qu'il y a un autre bug dans notre script sur ligne 21. Donc, nous avons encore une correction de syntaxe à faire.

Si nous regardons le script analytiquement une fois de plus, l'erreur sur ligne 21 est dû à une double citation de clôture manquante (”) Dans la dernière commande echo à l'intérieur du print_sys_info fonction.

Nous ajouterons la double citation de clôture dans le écho commander et enregistrer le fichier. Le script modifié est ci-dessous:

#!/ bin / bash #script pour imprimer les informations brèves d'informations système root_id = "0" date = "date" no_users = "who | wc -l" uptime = "uptime" check_root () if ["$ uid" -ne "$ root_id "]; puis écho "Vous n'êtes pas autorisé à exécuter ce programme!"Exit 1; fi print_sys_info () echo" Heure du système: $ date "echo" Nombre d'utilisateurs: $ no_users "echo" Uptime du système: $ Uptime " check_root print_sys_info exit 0 

Vérifiez maintenant syntaxiquement le script une fois de plus.

$ sudo bash -n sys_info.shot 

La commande ci-dessus ne produira aucune sortie car notre script est désormais syntaxiquement correct. Nous pouvons également tracer l'exécution du script pour la deuxième fois et cela devrait bien fonctionner:

$ sudo bash -x sys_info.shot 
Exécution du script de shell trace

Maintenant, exécutez le script.

$ sudo ./ sys_info.shot 
Script shell pour afficher la date, l'heure et la disponibilité

Importance du traçage d'exécution du script de shell

Le traçage du script de shell nous aide à identifier les erreurs de syntaxe et, plus important encore, les erreurs logiques. Prendre par exemple le check_root fonction dans le sys_info.shot Script de shell, qui est destiné à déterminer si un utilisateur est root ou non, car le script ne peut être exécuté que par le superutilisateur.

check_root () if ["$ uid" -ne "$ root_id"]; puis écho "Vous n'êtes pas autorisé à exécuter ce programme!"Exit 1; fi 

La magie ici est contrôlée par le Si déclaration expression ["$ Uid" -ne "$ root_id"], Une fois que nous n'utilisons pas l'opérateur numérique approprié (-ne Dans ce cas, ce qui signifie pas égal), nous nous retrouvons avec une éventuelle erreur logique.

En supposant que nous avons utilisé -égaliseur (signifie égal à), cela permettrait à n'importe quel utilisateur système ainsi qu'à l'utilisateur racine d'exécuter le script, d'où une erreur logique.

check_root () if ["$ uid" -eq "$ root_id"]; puis écho "Vous n'êtes pas autorisé à exécuter ce programme!"Exit 1; fi 

Note: Comme nous l'avons regardé auparavant au début de cette série, la commande intégrée Shell peut activer le débogage dans une section particulière d'un script de shell.

Par conséquent, la ligne ci-dessous nous aidera à trouver cette erreur logique dans la fonction en traçant son exécution:

Le script avec une erreur logique:

#!/ bin / bash #script pour imprimer les informations brèves d'informations système root_id = "0" date = "date" no_users = "who | wc -l" uptime = "uptime" check_root () if ["$ uid" -eq "$ root_id "]; puis écho "Vous n'êtes pas autorisé à exécuter ce programme!"Exit 1; fi print_sys_info () echo" Heure du système: $ date "echo" Nombre d'utilisateurs: $ no_users "echo" Uptime du système: $ Uptime " #urning on et désactiver le débogage de vérification de la fonction_ROOT Set -x; vérifie_ ; set + x; print_sys_info exit 0 

Enregistrer le fichier et invoquer le script, nous pouvons voir qu'un utilisateur système régulier peut exécuter le script sans Sudo Comme dans la sortie ci-dessous. C'est parce que la valeur de ID DE L'UTILISATEUR est 100 qui n'est pas égal à la racine Root_id lequel est 0.

$ ./ sys_info.shot 
Exécuter le script shell sans sudo

Eh bien, c'est tout pour l'instant, nous sommes arrivés à la fin de la série de débogage du script Shell, le formulaire de réponse ci-dessous peut être utilisé pour nous répondre à toutes les questions ou commentaires, concernant ce guide ou toute la série en 3 parties en 3 parties.