Recuperando o diretório onde o script está sendo executado (Linux/Bash)

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.

The following two tabs change content below.
Arquiteto de Software e Desenvolvedor Backend (quase Fullstack), geralmente trabalho com C#, PowerShell, Python, Golang, bash e Unity (esse é mais por hobby). Estou sempre buscando algo novo para aprender, adicionando novas ferramentas ao meu cinto de utilidades.
Posted in Dev, Linux/Bash and tagged , , , , , .