Comment choisir entre "$0"
et"${BASH_SOURCE[0]}"
Cette description de GNU ne m'a pas beaucoup aidé.
BASH_SOURCE
An array variable whose members are the source filenames where the
corresponding shell function names in the FUNCNAME array variable are
defined. The shell function ${FUNCNAME[$i]} is defined in the file
${BASH_SOURCE[$i]} and called from ${BASH_SOURCE[$i+1]}
BASH_SOURCE
a été ajouté à bash-3.0-alpha. Vous ne l'avez peut-être pas, selon votre régime de test. Je l'ai trouvé manquant à la fois sur les premiers Solaris et OS X. Voir aussi return: ne peut «retourner» qu'à partir d'une fonction ou d'un script source sur U & L.SE.Réponses:
Remarque: pour une solution compatible POSIX, consultez cette réponse .
${BASH_SOURCE[0]}
(ou, plus simplement,$BASH_SOURCE
[1] ) contient le chemin (potentiellement relatif) du script contenant dans tous les scénarios d'appel, notamment également lorsque le script est source , ce qui n'est pas vrai pour$0
.De plus, comme le souligne Charles Duffy ,
$0
peut être défini sur une valeur arbitraire par l'appelant.D'un autre côté,
$BASH_SOURCE
peut être vide, si aucun fichier nommé n'est impliqué; par exemple:echo 'echo "[$BASH_SOURCE]"' | bash
L'exemple suivant illustre ceci:
Script
foo
:$0
fait partie de la spécification du shell POSIX, alors queBASH_SOURCE
, comme son nom l'indique, est spécifique à Bash.[1] Lecture facultative:
${BASH_SOURCE[0]}
vs$BASH_SOURCE
.:Bash vous permet de référencer un élément
0
d'une variable de tableau en utilisant la notation scalaire : au lieu d'écrire${arr[0]}
, vous pouvez écrire$arr
; en d'autres termes: si vous référencez la variable comme s'il s'agissait d'un scalaire , vous obtenez l'élément à l'index0
.L'utilisation de cette fonctionnalité masque le fait qu'il
$arr
s'agit d'un tableau, c'est pourquoi le populaire shell-code linter shellcheck.net émet l'avertissement suivant (au moment d'écrire ces lignes ):Sur une note latérale: bien que cet avertissement soit utile, il pourrait être plus précis, car vous n'obtiendrez pas nécessairement le premier élément: c'est spécifiquement l'élément à l'index
0
qui est retourné, donc si le premier élément a un index plus élevé - qui est possible dans Bash - vous obtiendrez la chaîne vide; essayez'a[1]='hi'; echo "$a"'
.(En revanche,
zsh
jamais le renégat, en effet ne retourne le premier élément, quel que soit son indice).Vous pouvez choisir d'éviter cette fonctionnalité en raison de son obscurité, mais elle fonctionne de manière prévisible et, de manière pragmatique, vous aurez rarement, voire jamais, besoin d'accéder à des indices autres que ceux
0
de la variable de tableau${BASH_SOURCE[@]}
.la source
$BASH_SOURCE
c'est le meilleur choix.Ces scripts peuvent aider à illustrer. Le script externe appelle le script du milieu, qui appelle le script interne:
Cependant, si nous modifions les appels de script aux
source
instructions:la source
Pour la portabilité, utilisez
${BASH_SOURCE[0]}
quand il est défini, et$0
autrement. Ça donneNotamment, disons zsh, le $ 0 contient le chemin de fichier correct même si le script est
source
d.la source