Recuperando o diretório onde o script está sendo executado (Linux/Bash)
Overview
Bem-vindo a mais uma jornada pelo universo dos scripts Linux! No nosso último encontro, desvendamos os mistérios dos argumentos via linha de comando. Hoje, vamos elevar o nível e mergulhar na arte de salvar o diretório de execução de um script em uma variável. Parece simples, mas garantimos que tem seus truques. Vem comigo desbravar esse conhecimento que, embora pareça pequeno, faz uma grande diferença no manejo dos seus scripts.
No último post, mostrei como recuperar argumentos passados via linha de comando. Neste post vou mostrar como salvar em uma variável o diretório em que o script executado está armazenado. É um processo simples, mas tem um detalhe importante que pode fazer toda a diferença no seu script.
Como demonstrei no último script, a variável $0 ($ zero) mostra o diretório do script mas, na verdade, ela mostra o caminho que você utilizou para executar o script e isso faz toda a diferença.
Dois exemplos para demonstrar o que estou falando.
Extraindo o caminho + nome do script
Se você executar um script desta forma:
sudo ./script.sh
A variável $0 vai ter o valor: ./script.sh
Se você executar o script desta forma:
sudo /scripts/foo/bar/script.sh
A variável $0 vai ter o valor: /scripts/foo/bar/script.sh
Extraindo o diretório do caminho completo do script
Esta parte é bem simples, basta utilizar a função dirname:
diretorio=$(dirname "$0")
No exemplo acima, a variável diretorio vai receber a parte do conteúdo de “$0” que contém o diretório.
Atenção para os detalhes:
diretorio=$(dirname "./script.sh")
Com este comando, a variável diretorio vai possuir o valor “.” (ponto). Todavia, se utilizarmos o comando:
diretorio=$(dirname "/scripts/foo/bar/script.sh")
Neste caso, a variável vai ter o valor: “/scripts/foo/bar”.
Sendo assim, você deve tomar cuidado quando executar um script e precisar da referência do diretório onde ele está armazenado. Especialmente se você trocar o diretório durante a execução do script.
Para ajudar neste ponto, podemos processar o valor retornado pela função dirname.
Processando valor retornado pela função dirname
Podemos fazer uma verificação simples para armazenar o caminho do script. Para isso, vamos expandir um pouco o exemplo anterior:
diretorio=$(dirname "$0")
if [[ "$diretorio" == "." ]]; then
diretorio=$(pwd)
fi
Na primeira linha do código acima, recupero o diretorio da variável $0. Depois faço uma comparação para ver se o valor desta variável é igual a “.” (ponto). Se for, o script utiliza a função pwd para recuperar o caminho atual e o armazena na variável diretorio.
Desta forma, a variável diretorio sempre vai possuir o diretorio completo do script que está sendo executado e você pode utilizar esta referencia durante toda execução do seu script.
Espero ter ajudado.