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.
Latest posts by Breno RdV (see all)
- O que é Metaclass e como ela funciona. (#python #dev #metaclass) - janeiro 11, 2023
- Entenda a mágica dos Generators. (#python, #dev, #generator, #iterator) - dezembro 28, 2022
- Ordenando um DataFrame por múltiplas colunas. (#python #pandas #jupyter #dev #data) - agosto 3, 2022