En bash, y a-t-il un équivalent de die “error msg”

En perl, vous pouvez sortir avec un message d’erreur avec le die "some msg" . Existe-t-il une commande unique équivalente dans bash? En ce moment, j’y parviens en utilisant les commandes: echo "some msg" && exit 1

Vous pouvez rouler assez facilement:

 die() { echo "$*" 1>&2 ; exit 1; } ... die "Kaboom" 

Voici ce que j’utilise C’est trop petit pour mettre dans une bibliothèque, donc je dois l’avoir tapé des centaines de fois …

 warn () { echo "$0:" "$@" >&2 } die () { rc=$1 shift warn "$@" exit $rc } 

Utilisation: die 127 "Syntax error"

C’est une fonction très proche de “die” de perl (mais avec le nom de la fonction):

 function die { local message=$1 [ -z "$message" ] && message="Died" echo "$message at ${BASH_SOURCE[1]}:${FUNCNAME[1]} line ${BASH_LINENO[0]}." >&2 exit 1 } 

Et bash façon de mourir si la fonction intégrée a échoué (avec le nom de la fonction)

 function die { local message=$1 [ -z "$message" ] && message="Died" echo "${BASH_SOURCE[1]}: line ${BASH_LINENO[0]}: ${FUNCNAME[1]}: $message." >&2 exit 1 } 

Ainsi, Bash conserve toutes les informations nécessaires dans plusieurs variables d’environnement:

  • LINENO – numéro de la ligne en cours d’exécution
  • FUNCNAME – stack d’appels de fonctions, le premier élément (index 0) est la fonction courante, le second (index 1) est la fonction qui a appelé la fonction actuelle
  • BASH_LINENO – stack d’appels de numéros de ligne, où FUNCNAME correspondant a été appelé
  • BASH_SOURCE – tableau du fichier source où est stocké le FUNCNAME correspondant

Ouais, c’est à peu près comme ça que vous le faites.

Vous pouvez utiliser un point-virgule ou une nouvelle ligne au lieu de &&, puisque vous voulez savoir si écho réussit ou non (même si je ne suis pas sûr de ce qui le ferait échouer).

Programmer dans un shell signifie utiliser beaucoup de petites commandes (certaines commandes intégrées, quelques programmes minuscules) qui font une chose bien et les connectent avec la redirection de fichier, la logique de code de sortie et d’autres types de colle.

Cela peut sembler étrange si vous avez l’habitude des langages où tout est fait avec des fonctions ou des méthodes, mais vous vous y habituez.

 # echo pass params and print them to a log file wlog(){ # check terminal if exists echo test -t 1 && echo "`date +%Y.%m.%d-%H:%M:%S` [$$] $*" # check LogFile and test -z $LogFile || { echo "`date +%Y.%m.%d-%H:%M:%S` [$$] $*" >> $LogFile } #eof test } # eof function wlog # exit with passed status and message Exit(){ ExitStatus=0 case $1 in [0-9]) ExitStatus="$1"; shift 1;; esac Msg="$*" test "$ExitStatus" = "0" || Msg=" ERROR: $Msg : $@" wlog " $Msg" exit $ExitStatus } #eof function Exit