S bash>=3 následující práce:
$ ./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
dává správnou odpověď při získávání skriptu.
To však zahrnuje cestu, takže pro získání pouze názvu souboru skriptů použijte:
$(basename $BASH_SOURCE)
me=`basename "$0"`
Pro čtení pomocí symbolického odkazu, který obvykle není to, co chcete (obvykle nechcete uživatele tímto způsobem zmást), zkuste:
me="$(basename "$(test -L "$0" && readlink "$0" || echo "$0")")"
IMO, to bude mít matoucí výstup. "Spustil jsem foo.sh, ale je tam napsáno, že běžím bar.sh!? Musí to být chyba!" Kromě toho je jedním z účelů odlišně pojmenovaných symbolických odkazů poskytovat různé funkce na základě názvu, který se nazývá (na některých platformách například gzip a gunzip).
Tedy vyřešit symbolické odkazy tak, že když uživatel spustí foo.sh
což je ve skutečnosti symbolický odkaz na bar.sh
, chcete použít přeložený název bar.sh
spíše než foo.sh
.