Consulte: Entrada nº 28 da FAQ do BASH: "Como determino a localização do meu script? Quero ler alguns arquivos de configuração do mesmo lugar."
Qualquer solução não vai funcionar 100% do tempo:
É importante perceber que no caso geral, esse problema não tem solução. Qualquer abordagem da qual você já deve ter ouvido falar, e qualquer abordagem que será detalhada a seguir, tem falhas e só funcionará em casos específicos. Em primeiro lugar, tente evitar o problema totalmente, não dependendo da localização do seu script!
Se você precisar escrever uma ferramenta muito reutilizável, usar o caminho correto como parâmetro para o seu script será o método mais confiável .
Supondo que seu script será executado apenas a partir de determinados shells, e apenas com um pouco de flexibilidade necessária, você provavelmente pode relaxar um pouco dessa paranóia. Ainda é bom olhar para as suas opções. Existem padrões comuns que as pessoas usam que são particularmente problemáticos.
Em particular, o FAQ recomenda evitar a $0
variável muito comumente usada :
Nada do que lê $0
jamais será à prova de balas, porque em $0
si mesmo não é confiável.
Como alternativa, você pode usar $BASH_SOURCE
. Algo assim:
source "${BASH_SOURCE%/*}/act.conf.sh"
Existem algumas ressalvas para essa solução também. Confira a página de perguntas frequentes para ver as compensações entre as diferentes soluções. Eles parecem ser recomendados cd
em combinação com $BASH_SOURCE
casos em que funcionará para você, pois você obterá uma condição de erro útil quando ele não se expandir adequadamente.
readlink
. Não foi possível determinar as palavras-chave a serem pesquisadas, então postei a pergunta aqui ...cd "${BASH_SOURCE%/*}" || exit
ouread somevar < "${BASH_SOURCE%/*}/etc/somefile"
Link Desencoraja fortemente$0
"Nada que leia $ 0 será à prova de balas, porque $ 0 em si não é confiável."Veja isto: Bash: Como _melhor_ incluir outros scripts?
Eu sugiro usar:
fonte
$0
é inerentemente cheio de erros. Veja a resposta mais votada e aceita sobre o motivo, ou simplesmente leia mywiki.wooledge.org/BashFAQ/028 - uma breve solução alternativa para a pergunta feita é algo comosource "${BASH_SOURCE%/*}/act.conf.sh"
Experimente o seguinte:
fonte