Avec bash>=3 les travaux suivants :
$ ./s
0 is: ./s
BASH_SOURCE is: ./s
$ . ./s
0 is: bash
BASH_SOURCE is: ./s
$ cat s
#!/bin/bash
printf '$0 is: %s\n$BASH_SOURCE is: %s\n' "$0" "$BASH_SOURCE"
# ------------- SCRIPT ------------- #
#!/bin/bash
echo
echo "# arguments called with ----> ${@} "
echo "# \$1 ----------------------> $1 "
echo "# \$2 ----------------------> $2 "
echo "# path to me ---------------> ${0} "
echo "# parent path --------------> ${0%/*} "
echo "# my name ------------------> ${0##*/} "
echo
exit
# ------------- CALLED ------------- #
# Notice on the next line, the first argument is called within double,
# and single quotes, since it contains two words
$ /misc/shell_scripts/check_root/show_parms.sh "'hello there'" "'william'"
# ------------- RESULTS ------------- #
# arguments called with ---> 'hello there' 'william'
# $1 ----------------------> 'hello there'
# $2 ----------------------> 'william'
# path to me --------------> /misc/shell_scripts/check_root/show_parms.sh
# parent path -------------> /misc/shell_scripts/check_root
# my name -----------------> show_parms.sh
# ------------- END ------------- #
$BASH_SOURCE
donne la bonne réponse lors de la recherche du script.
Cela inclut cependant le chemin, donc pour obtenir uniquement le nom de fichier des scripts, utilisez :
$(basename $BASH_SOURCE)
me=`basename "$0"`
Pour lire un lien symbolique, ce qui n'est généralement pas ce que vous voulez (vous ne voulez généralement pas confondre l'utilisateur de cette façon), essayez :
me="$(basename "$(test -L "$0" && readlink "$0" || echo "$0")")"
IMO, cela produira une sortie confuse. "J'ai exécuté foo.sh, mais ça dit que j'exécute bar.sh ! ? Ça doit être un bug !" En outre, l'un des objectifs d'avoir des liens symboliques portant des noms différents est de fournir des fonctionnalités différentes en fonction du nom auquel ils sont appelés (pensez à gzip et gunzip sur certaines plates-formes).
Autrement dit, pour résoudre les liens symboliques tels que lorsque l'utilisateur exécute foo.sh
qui est en fait un lien symbolique vers bar.sh
, vous souhaitez utiliser le nom résolu bar.sh
plutôt que foo.sh
.