Como se escolhe entre "$0"
e"${BASH_SOURCE[0]}"
Esta descrição do GNU não me ajudou muito.
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
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.Respostas:
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
:$0
faz parte da especificação do shell POSIX, enquantoBASH_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 índice0
.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):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[@]}
.fonte
$BASH_SOURCE
é a melhor escolha.Esses scripts podem ajudar a ilustrar. O script externo chama o script do meio, que chama o script interno:
No entanto, se alterarmos as chamadas de script para
source
instruções:fonte
Para portabilidade, use
${BASH_SOURCE[0]}
quando estiver definido e de$0
outra forma. Isso dáNotavelmente, em dizer zsh, o $ 0 contém o caminho de arquivo correto, mesmo se o script for
source
d.fonte