Digamos que eu tenha um script bash em uma pasta chamada Programming
, que lê dados de arquivos em uma subpasta chamada data
.
Os caminhos no script para os arquivos são todos relativos a esta pasta "Programação".
echo "test" > ./data/test.txt
.
Portanto o diretório de trabalho deve ser sempre a pasta “Programação”.
Quando o script passa em todos os testes, ele está concluído e pensei que poderia facilmente copiar todo o conteúdo da pasta "Programação" para uma subpasta em /opt
, digamos /opt/myapplication
, e então fazer um link simbólico na /usr/bin
pasta chamada myapplication
, que vincula ao script em /opt/myapplication/bash_script
para torná-lo acessível no ambiente.
Mas o problema é que se eu chamar myapplication de qualquer lugar onde o diretório de trabalho esteja
$PWD= #actual shell directory at script start
$0=/usr/bin/myapplication
${BASH_SOURCE[0]}=/usr/bin/myapplication
e meu aplicativo falha. Achei que o link simbólico mudaria o diretório de trabalho para onde o arquivo está localizado.
Qual é a prática comum no Unix de definir sempre o diretório de trabalho, onde o arquivo executado está localizado, para usar caminhos relativos?
Não há, realmente. Na maioria dos casos, você poderia usar
$0
e fazer umcd
script interno com base nisso, mas o que aparece$0
pode não ajudar muito, pois pode ser um caminho relativo ou pode ser um caminho através de um link simbólico.Mas, outra questão é se você deveria fazer isso de qualquer maneira. A ideia comum é que as ferramentas residam em algum diretório
PATH
e sejam usadas no diretório onde estão os arquivos de dados. Dessa forma, uma única ferramenta pode ser utilizada para mais de um conjunto de arquivos de dados e por diferentes usuários.Outra maneira comum de definir um caminho padrão é usar uma variável de ambiente. Faça com que o script contenha algo como
if [ -d "$MYAPP_DIR" ]; then cd "$MYAPP_DIR"; fi
e então o usuário poderá definirMYAPP_DIR
os arquivos de inicialização do shell como desejar.