¿Cómo se elige entre "$0"
y"${BASH_SOURCE[0]}"
Esta descripción de GNU no me ayudó mucho.
BASH_SOURCE
An array variable whose members are the source filenames where the
corresponding shell function names in the FUNCNAME array variable are
defined. The shell function ${FUNCNAME[$i]} is defined in the file
${BASH_SOURCE[$i]} and called from ${BASH_SOURCE[$i+1]}
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.Respuestas:
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
:$0
es parte de la especificación del shell POSIX, mientras queBASH_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 index0
.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):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[@]}
.fuente
$BASH_SOURCE
es la mejor opción.Estos guiones pueden ayudar a ilustrar. El script externo llama al script intermedio, que llama al script interno:
Sin embargo, si cambiamos las llamadas del script a las
source
declaraciones:fuente
Para la portabilidad, utilícelo
${BASH_SOURCE[0]}
cuando esté definido y de$0
otro modo. Eso daEn particular, por ejemplo, zsh, $ 0 contiene la ruta de archivo correcta incluso si el script es
source
d.fuente