choisir entre $ 0 et BASH_SOURCE

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[0]} (ou, plus simplement, $BASH_SOURCE [1] ) contient le chemin (potentiellement relatif) du script contenant dans tous les scénarios d’appel, notamment lorsque le script est généré , ce qui n’est pas le cas pour $0 .

De plus, comme le souligne Charles Duffy , $0 peut être mis à 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 :

 #!/usr/bin/env bash echo "[$0] vs. [${BASH_SOURCE[0]}]" 

 $ bash ./foo [./foo] vs. [./foo] $ . ./foo [bash] vs. [./foo] 

$0 fait partie de la spécification du shell POSIX, alors que BASH_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 l’é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’index 0 .

L’utilisation de cette fonctionnalité masque le fait que $arr est un tableau, ce qui explique pourquoi le shell shell-code shellcheck.net populaire émet l’avertissement suivant (au moment d’écrire ces lignes ):

SC2128: L’extension d’un tableau sans index ne donne que le premier élément.

Remarque: 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 précisément l’élément à l’index 0 qui est renvoyé, donc si le premier élément a un index plus élevé – ce qui est possible dans Bash – vous obtiendrez la chaîne vide; essayez 'a[1]='hi'; echo "$a"' 'a[1]='hi'; echo "$a"' .
(En revanche, zsh , toujours le renégat, renvoie effectivement le premier élément, indépendamment de son index).

Vous pouvez choisir d’éviter cette fonctionnalité à cause de son obscurité, mais cela fonctionne de manière prévisible et, de manière pragmatique, vous aurez rarement, voire jamais, besoin d’accéder à des indices autres que 0 de la variable de tableau ${BASH_SOURCE[@]} .