Nota: Para obtener una solución compatible con POSIX, consulte esta respuesta .
${BASH_SOURCE[0]}
(o, más simplemente, $BASH_SOURCE
[1]
) contiene la ruta (potencialmente relativa) del script contenedor en todos los escenarios de invocación, en particular también cuando se obtiene el script , lo cual no es cierto para $0
.
Además, como señala Charles Duffy , la persona que llama $0
puede establecer un valor arbitrario .
Por otro lado, $BASH_SOURCE
puede estar vacío, si no hay un archivo con nombre involucrado; p.ej:
echo 'echo "[$BASH_SOURCE]"' | bash
El siguiente ejemplo lo ilustra:
Guión foo
:
#!/bin/bash
echo "[$0] vs. [${BASH_SOURCE[0]}]"
$ bash ./foo
[./foo] vs. [./foo]
$ ./foo
[./foo] vs. [./foo]
$ . ./foo
[bash] vs. [./foo]
$0
es parte de la especificación del shell POSIX, mientras que BASH_SOURCE
, como sugiere el nombre, es específico de Bash.
[1] Lectura opcional: ${BASH_SOURCE[0]}
vs$BASH_SOURCE
.:
Bash le permite hacer referencia al elemento 0
de una variable de matriz usando notación escalar : en lugar de escribir ${arr[0]}
, puede escribir $arr
; en otras palabras: si hace referencia a la variable como si fuera un escalar , obtiene el elemento en index 0
.
El uso de esta característica oculta el hecho de que $arr
es una matriz, por lo que el popular linter shellcheck.net emite la siguiente advertencia (al momento de escribir este artículo):
SC2128: Expandir una matriz sin un índice solo da el primer elemento.
En una nota al margen: si bien esta advertencia es útil, podría ser más precisa, porque no necesariamente obtendrá el primer elemento: es específicamente el elemento en el índice 0
que se devuelve, por lo que si el primer elemento tiene un índice más alto, que es posible en Bash - obtendrá la cadena vacía; tratar 'a[1]='hi'; echo "$a"'
.
(Por el contrario, zsh
siempre el renegado, de hecho , devuelve el primer elemento, independientemente de su índice).
Usted puede optar por evitar esta característica debido a su oscuridad, pero funciona predecible y, pragmáticamente hablando, usted rara vez, o nunca, necesidad de acceso ÍNDICES otra que 0
de variable de matriz ${BASH_SOURCE[@]}
.
BASH_SOURCE
se agregó en bash-3.0-alpha. Es posible que no lo tenga, dependiendo de su régimen de pruebas. Encontré que faltaba tanto en los primeros Solaris como en OS X. Consulte también return: solo puede "regresar" desde una función o un script de origen en U & L.SE.