GNU/Linux >> Tutoriales Linux >  >> Linux

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

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 .


Linux
  1. ¿Por qué The Bash Script no reconoce los alias?

  2. ¿Cómo depurar un script Bash?

  3. Bash Script para eliminar el archivo más antiguo de una carpeta?

  4. ¿Cómo detener el script Loop Bash en la terminal?

  5. ¿Cómo leer todo el script de Shell antes de ejecutarlo?

35 ejemplos de secuencias de comandos Bash

Cómo ejecutar un script Bash

¿Cómo comprobar el nombre de la base de datos de Joomla?

Cómo reemplazar espacios en nombres de archivos usando un script bash

Cómo incluir un archivo en un script de shell bash

¿Cómo obtengo el directorio absoluto de un archivo en bash?