Con bash>=3 las siguientes obras:
$ ./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
da la respuesta correcta al obtener el script.
Sin embargo, esto incluye la ruta, por lo que para obtener solo el nombre de archivo de los scripts, use:
$(basename $BASH_SOURCE)
me=`basename "$0"`
Para leer a través de un enlace simbólico, que generalmente no es lo que desea (por lo general, no desea confundir al usuario de esta manera), intente:
me="$(basename "$(test -L "$0" && readlink "$0" || echo "$0")")"
En mi opinión, eso producirá una salida confusa. "Ejecuté foo.sh, ¿¡pero dice que estoy ejecutando bar.sh!? ¡Debe ser un error!" Además, uno de los propósitos de tener enlaces simbólicos con nombres diferentes es proporcionar una funcionalidad diferente según el nombre con el que se llamen (piense en gzip y gunzip en algunas plataformas).
Es decir, para resolver enlaces simbólicos de manera que cuando el usuario ejecute foo.sh
que en realidad es un enlace simbólico a bar.sh
, desea utilizar el nombre resuelto bar.sh
en lugar de foo.sh
.