J'ai un script de test qui a beaucoup de commandes et générera beaucoup de sortie, j'utilise set -x
ou set -v
et set -e
, donc le script s'arrêterait en cas d'erreur. Cependant, il est encore assez difficile pour moi de localiser la ligne sur laquelle l'exécution s'est arrêtée afin de localiser le problème. Existe-t-il une méthode qui peut afficher le numéro de ligne du script avant que chaque ligne ne soit exécutée? Ou afficher le numéro de ligne avant l'exposition de commande générée par set -x
? Ou toute méthode qui peut résoudre mon problème d'emplacement de ligne de script serait d'une grande aide. Merci.
89
echo
echo
mieux éviter les déclarations inutiles .-x
devrait imprimer les numéros de ligne. Ou, peut-être -nx
devrait inclure les numéros de ligne. Pour moi, c'est un de ces moments "WTF" ...\033[0;33m+(${BASH_SOURCE}:${LINENO}):\033[0m ${FUNCNAME[0]:+${FUNCNAME[0]}(): }'
pour quelques couleursDans 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.
la source
Solution simple (mais puissante): placez
echo
autour du code que vous pensez qui cause le problème et déplacez laecho
ligne par ligne jusqu'à ce que les messages n'apparaissent plus à l'écran - car le script s'est arrêté à cause d'une erreur avant.Solution encore plus puissante: installez
bashdb
le débogueur bash et déboguez le script ligne par lignela source
echo
Les trucs autour peuvent aider dans de nombreux cas, mais échouent lorsque vous essayez de l'appliquer dans des fonctions qui ont une sortie significative et analysable.echo "foo" >&2
Solution de contournement pour les coques sans LINENO
Dans un script assez sophistiqué, je n'aimerais pas voir tous les numéros de ligne; plutôt je voudrais être en contrôle de la sortie.
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 citations 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 d'un script bash pour les utilisateurs de ash ou d'autres shells sans
LINENO
.Quelque chose à ajouter?
Sûr. Pourquoi en avez-vous besoin? Comment travaillez-vous avec cela? Que pouvez-vous faire avec ça? Cette approche simple est-elle vraiment suffisante ou utile? Pourquoi voulez-vous bricoler ça?
Veut en savoir plus? Lire les réflexions sur le débogage
la source