¿Cómo sé el nombre del archivo de script en un script Bash?
¿Cómo puedo determinar el nombre del archivo de script Bash dentro del propio script?
Por ejemplo, si mi secuencia de comandos está en el archivo runme.sh
, entonces ¿cómo haría para que muestre el mensaje "Estás ejecutando runme.sh" sin codificarlo?
me=$(basename "$0")
Para leer a través de un enlace simbólico 1 , que normalmente no es lo que desea (normalmente no desea confundir al usuario de esta manera), intente:
me="$(basename "$(test -L "$0" && readlink "$0" || echo "$0")")"
En mi opinión, eso producirá resultados confusos. "Ejecuté foo.sh, pero ¿¡me 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 denomina (piense en gzip y gunzip en algunas plataformas).
1 Es decir, para resolver enlaces simbólicos de modo que cuando el usuario ejecute foo.sh
cuál es en realidad un enlace simbólico a bar.sh
, desee utilizar el nombre resuelto bar.sh
en lugar de foo.sh
.
# ------------- GUION ------------- #
#!/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
# ------------- LLAMADO ------------- #
# Observe que en la siguiente línea, el primer argumento se llama dentro de doble,
# y comillas simples, ya que contiene dos palabras
$ /misc/shell_scripts/check_root/show_parms.sh "'hola'" "'william'"
# ------------- RESULTADOS ------------- #
# argumentos llamados con ---> 'hola' 'william'
# $1 ----------------------> 'hola'
# $2 ----------------------> 'Guillermo'
# ruta hacia mí --------------> /misc/shell_scripts/check_root/show_parms.sh
# ruta principal -------------> /misc/shell_scripts/check_root
# mi nombre -----------------> show_parms.sh
# ------------- FIN ------------- #
Con bash >= 3 lo siguiente funciona:
$ ./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"
$BASH_SOURCE
da la respuesta correcta al obtener el guión.
Sin embargo, esto incluye la ruta, por lo que para obtener solo el nombre del archivo de scripts, use:
$(basename $BASH_SOURCE)