Obtenha o caminho do script atual quando executado por meio de um link simbólico

43

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 ?

    
por Mike Deck 27.07.2011 / 22:06

4 respostas

60

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")")"
    
por 27.07.2011 / 22:10
3

uma linha:

cd $(dirname $([ -L $0 ] && readlink -f $0 || echo $0))
    
por 29.08.2014 / 04:41
1

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
    
por 08.10.2018 / 07:41
0

Uma pequena adição ao script acima. A opção -P para pwd segue os links simbólicos

DIR="$(cd "$(dirname "$0")" && pwd -P)"
    
por 02.09.2015 / 16:33