Eu tenho um utilitário que consiste em alguns diretórios com alguns scripts bash e arquivos de suporte que serão implantados em várias máquinas, possivelmente em um diretório diferente em cada máquina. Os scripts precisam ser capazes de fazer referência a caminhos relativos a si mesmos, portanto, preciso obter o caminho para o arquivo que está sendo executado no momento.
Estou ciente do dirname $0
idioma que funciona perfeitamente quando meu script é chamado diretamente. Infelizmente, existe um desejo de poder criar links simbólicos para esses scripts a partir de um diretório totalmente diferente e ainda assim ter o trabalho relativo da lógica de caminhos.
Um exemplo da estrutura geral do diretório é o seguinte:
/
|-usr/local/lib
| |-foo
| | |-bin
| | | |-script.sh
| | |-res
| | | |-resource_file.txt
|-home/mike/bin
| |-link_to_script (symlink to /usr/local/lib/foo/bin/script.sh)
Como posso confiável referência /usr/local/lib/foo/res/resource_file.txt
de script.sh
saber se é invocado por /usr/local/lib/foo/bin/script.sh
ou ~mike/bin/link_to_script
?
fonte
source
d (por exemplo$ source ./sript.sh
) Isso funciona nos dois casos:DIR="$(cd "$(dirname "$BASH_SOURCE")" && pwd)"
uma linha:
fonte
readlink -f
não funciona para mim, eu tenho esse erro:Mas isso funciona bem:
fonte
Uma pequena adição ao script acima. A opção -P para pwd segue links simbólicos
fonte