Observação: para uma solução compatível com POSIX, veja esta resposta .
${BASH_SOURCE[0]}(ou, mais simplesmente, $BASH_SOURCE[1]
) contém o caminho (potencialmente relativo) do script que o contém em todos os cenários de invocação, notavelmente também quando o script é originado , o que não é verdadeiro para $0.
Além disso, como Charles Duffy aponta, $0pode ser definido como um valor arbitrário pelo chamador.
Por outro lado, $BASH_SOURCE pode estar vazio, se nenhum arquivo nomeado estiver envolvido; por exemplo:
echo 'echo "[$BASH_SOURCE]"' | bash
O exemplo a seguir ilustra isso:
Script foo:
#!/bin/bash
echo "[$0] vs. [${BASH_SOURCE[0]}]"
$ bash ./foo
[./foo] vs. [./foo]
$ ./foo
[./foo] vs. [./foo]
$ . ./foo
[bash] vs. [./foo]
$0faz parte da especificação do shell POSIX, enquanto BASH_SOURCE, como o nome sugere, é específico do Bash.
[1] Leitura opcional: ${BASH_SOURCE[0]}vs$BASH_SOURCE .:
O Bash permite que você faça referência a um elemento 0de uma variável de array usando notação escalar : em vez de escrever ${arr[0]}, você pode escrever $arr; em outras palavras: se você referenciar a variável como se fosse um escalar , você obtém o elemento no índice 0.
O uso desse recurso obscurece o fato de que $arré uma matriz, e é por isso que o popular código de shell linter shellcheck.net emite o seguinte aviso (no momento desta redação):
SC2128: Expandir uma matriz sem um índice fornece apenas o primeiro elemento.
Em uma observação lateral: embora este aviso seja útil, pode ser mais preciso, porque você não obterá necessariamente o primeiro elemento: é especificamente o elemento no índice 0que é retornado, portanto, se o primeiro elemento tiver um índice mais alto - que é possível no Bash - você obterá a string vazia; tente 'a[1]='hi'; echo "$a"'.
(Em contraste, zsh, sempre o renegado, na verdade, faz retornar o primeiro elemento, independentemente do seu índice).
Você pode optar por evitar esse recurso devido à sua obscuridade, mas ele funciona de forma previsível e, pragmaticamente falando, você raramente, ou nunca, precisará acessar outros índices além 0da variável de array ${BASH_SOURCE[@]}.
BASH_SOURCEfoi adicionado em bash-3.0-alpha. Você pode não ter, dependendo do seu regime de teste. Descobri que ele estava faltando no Solaris anterior e no OS X. Veja também return: só pode `retornar 'de uma função ou script originado em U & L.SE.