2010-06-16 5 views
22

Y a-t-il une variable dans bash qui contient le nom du fichier .sh exécuté?
Le numéro de ligne serait également bon.Equivalent de `__FILE__`,` __LINE__` dans bash

Je veux l'utiliser dans les messages d'erreur tels que:
echo "ERREUR: [$ FICHIER: L $ LINE] somefile de $ non trouvé"

Répondre

20
#!/bin/bash 

echo $LINENO 
echo `basename $0` 

$LINENO pour le numéro de ligne $0 pour le fichier en cours. J'ai utilisé basename pour vous assurer d'obtenir uniquement le nom du fichier et non le chemin.

MISE À JOUR:

#!/bin/bash 

MY_NAME=`basename $0` 

function ouch { 
    echo "Fail @ [${MY_NAME}:${1}]" 
    exit 1 
} 

ouch $LINENO 

Vous devez passer la ligne en tant que paramètre si vous utilisez l'approche de la fonction sinon vous obtiendrez la ligne de la définition de la fonction.

+3

'basename $ 0' (pas de 'echo' est nécessaire) –

+3

Notez que si vous' source' le script, 'basename $ 0' retournera le script parent. – scribu

+2

Et aussi cela ne fonctionne pas bien dans les scripts shell de connexion chargé (~/.bashrc, /etc/profile.d/*). "BASH_SOURCE" et "BASH_LINENO" sont beaucoup mieux, même si ce sont des bashismes. – pevik

2

La variable $ 0 Pourriez-vous donner le nom de l'exécution du shell script dans bash.

6

Vous avez juste besoin

echo $LINENO 
echo $(basename $0) 
+0

'basename $ 0' (aucun' echo' n'est nécessaire) –

15

Je trouve la "BASH_SOURCE" et "BASH_LINENO" des tableaux intégrés très utiles:

$ cat xx 
#!/bin/bash 

_ERR_HDR_FMT="%.23s %s[%s]: " 
_ERR_MSG_FMT="${_ERR_HDR_FMT}%s\n" 

error_msg() { 
    printf "$_ERR_MSG_FMT" $(date +%F.%T.%N) ${BASH_SOURCE[1]##*/} ${BASH_LINENO[0]} "${@}" 
} 

error_msg "here" 


error_msg "and here" 

Invoquer rendements xx

2010-06-16.15:33:13.069 xx[11]: here 
2010-06-16.15:33:13.073 xx[14]: and here 
+0

Je préfère aussi utiliser les variables BASH_ * comme vous les avez décrites. Voici un bon article sur la façon de déboguer les scripts bash que j'ai référencés dans le passé: http://aymanh.com/how-debug-bash-scripts –

+0

c'est magnifique –