Comment afficher le numéro de ligne lors de l’exécution du script bash

J’ai un script de test qui a beaucoup de commandes et qui va générer beaucoup de sortie, j’utilise set -x ou set -v et set -e , donc le script s’arrêterait quand une erreur se produirait. Cependant, il m’est encore difficile de trouver quelle ligne a été exécutée pour localiser le problème. Existe-t-il une méthode permettant d’afficher le numéro de ligne du script avant l’exécution de chaque ligne? Ou afficher le numéro de ligne avant l’exposition de commande générée par set -x ? Ou toute méthode pouvant traiter de mon problème de localisation de ligne de script serait une grande aide. Merci.

Vous mentionnez que vous utilisez déjà -x . La variable PS4 indique que la valeur est l’invite imprimée avant que la ligne de commande ne soit répercutée lorsque l’option -x est définie et définie par défaut sur : suivi de l’espace.

Vous pouvez modifier PS4 pour émettre le LINENO (le numéro de ligne dans le script ou la fonction shell en cours d’exécution).

Par exemple, si votre script lit:

 $ cat script foo=10 echo ${foo} echo $((2 + 2)) 

En l’exécutant, on imprimerait donc des numéros de ligne:

 $ PS4='Line ${LINENO}: ' bash -x script Line 1: foo=10 Line 2: echo 10 10 Line 3: echo 4 4 

http://wiki.bash-hackers.org/scripting/debuggingtips donne la PS4 ultime qui produirait tout ce dont vous aurez besoin pour le traçage:

 export PS4='+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }' 

Dans Bash, $LINENO contient le numéro de ligne où le script est en cours d’exécution.

Si vous avez besoin de connaître le numéro de ligne où la fonction a été appelée, essayez $BASH_LINENO . Notez que cette variable est un tableau.

Par exemple:

 #!/bin/bash function log() { echo "LINENO: ${LINENO}" echo "BASH_LINENO: ${BASH_LINENO[*]}" } function foo() { log "$@" } foo "$@" 

Voir ici pour plus de détails sur les variables Bash.

Solution simple (mais puissante): placez l’ echo autour du code que vous pensez être à l’origine du problème et déplacez l’ echo ligne par ligne jusqu’à ce que les messages n’apparaissent plus à l’écran – car le script s’est arrêté à cause d’une erreur.

Une solution encore plus puissante: installez bashdb le débogueur bash et déboguez le script ligne par ligne

Solution de contournement pour les shells sans LINENO

Dans un script assez sophistiqué, je ne voudrais pas voir tous les numéros de ligne; J’aimerais plutôt avoir le contrôle de la production.

Définir une fonction

 echo_line_no () { grep -n "$1" $0 | sed "s/echo_line_no//" # grep the line(s) containing input $1 with line numbers # replace the function name with nothing } # echo_line_no 

Utilisez-le avec des guillemets comme

 echo_line_no "this is a simple comment with a line number" 

La sortie est

 16 "this is a simple comment with a line number" 

si le numéro de cette ligne dans le fichier source est 16.

Cela répond essentiellement à la question Comment afficher le numéro de ligne lors de l’exécution du script bash pour les utilisateurs de cendres ou d’autres shells sans LINENO .

Quelque chose de plus à append?

Sûr. Pourquoi avez-vous besoin de cela? Comment travaillez-vous avec ça? Que pouvez-vous faire avec ça? Cette approche simple est-elle vraiment suffisante ou utile? Pourquoi voulez-vous bricoler?

Veulent en savoir plus? Lire les reflections sur le débogage