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_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]
$0es 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 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 index 0.
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):
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 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[@]}.
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.