Tente isso como uma solução de propósito geral:
DIR="$(cd "$(dirname "$0")" && pwd)"
No caso específico de seguir os links simbólicos, você também pode fazer isso:
DIR="$(dirname "$(readlink -f "$0")")"
Eu tenho um utilitário que consiste em alguns diretórios com alguns scripts bash e arquivos de suporte que serão implementados em várias máquinas, possivelmente em um diretório diferente em cada máquina. Os scripts precisam ser capazes de referenciar caminhos relativos a si mesmos, então eu preciso ser capaz de obter o caminho para o arquivo que está sendo executado no momento.
Estou ciente do idioma dirname $0
que funciona perfeitamente quando meu script é chamado diretamente. Infelizmente, há o desejo de criar links simbólicos para esses scripts a partir de um diretório totalmente diferente e ainda ter o trabalho de lógica de caminho relativo.
Um exemplo da estrutura geral do driector é 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 referenciar de forma confiável /usr/local/lib/foo/res/resource_file.txt
de script.sh
se ele é invocado por /usr/local/lib/foo/bin/script.sh
ou ~mike/bin/link_to_script
?
uma linha:
cd $(dirname $([ -L $0 ] && readlink -f $0 || echo $0))
readlink -f
não funciona para mim, tenho este erro:
readlink: illegal option -- f
usage: readlink [-n] [file ...]
Mas isso funciona bem:
DIR="$(dirname "$(readlink "$0")")"
echo $DIR
Uma pequena adição ao script acima. A opção -P para pwd segue os links simbólicos
DIR="$(cd "$(dirname "$0")" && pwd -P)"
Tags bash symlink shell-script