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, $0
pode 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]
$0
faz 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 0
de 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 0
que é 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 0
da variável de array ${BASH_SOURCE[@]}
.
BASH_SOURCE
foi 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.