Comment tracer l'exécution des commandes dans le script shell avec le traçage de la coquille
- 5004
- 335
- Rayan Lefebvre
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.
- Comment activer le mode de débogage du script shell dans Linux - partie 1
- 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.shotShell 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.shotSyntaxe 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.shotEffectuer 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.shotExécution du script de shell trace
Maintenant, exécutez le script.
$ sudo ./ sys_info.shotScript 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.shotExé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.
- « Correction de l'erreur 2003 (HY000) Impossible de se connecter au serveur MySQL sur '127.0.0.1 '(111)
- 3 outils de numérisation de disque Linux GUI et terminaux utiles »