¿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_SOURCEse 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
$0puede establecer un valor arbitrario .Por otro lado,
$BASH_SOURCEpuede estar vacío, si no hay un archivo con nombre involucrado; p.ej:echo 'echo "[$BASH_SOURCE]"' | bashEl siguiente ejemplo lo ilustra:
Guión
foo:$0es 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
0de 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
$arres 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
0que 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,
zshsiempre 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
0de variable de matriz${BASH_SOURCE[@]}.fuente
$BASH_SOURCEes 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
sourcedeclaraciones:fuente
Para la portabilidad, utilícelo
${BASH_SOURCE[0]}cuando esté definido y de$0otro modo. Eso daEn particular, por ejemplo, zsh, $ 0 contiene la ruta de archivo correcta incluso si el script es
sourced.fuente