¿Cómo sé el nombre del archivo de script en un script Bash?

Resuelto Ma99uS asked hace 16 años • 26 respuestas

¿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?

Ma99uS avatar Oct 11 '08 00:10 Ma99uS
Aceptado
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.shcuál es en realidad un enlace simbólico a bar.sh, desee utilizar el nombre resuelto bar.shen lugar de foo.sh.

Tanktalus avatar Oct 10 '2008 17:10 Tanktalus
# ------------- 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 ------------- #
Bill Hernandez avatar Aug 28 '2010 00:08 Bill Hernandez

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"
Dimitre Radoulov avatar Mar 12 '2009 16:03 Dimitre Radoulov

$BASH_SOURCEda 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) 
Zainka avatar Jun 15 '2011 09:06 Zainka