Caminho de pesquisa do arquivo-fonte do symlink

0

Eu tenho meu script principal que cria um arquivo bash na mesma pasta:

 $ cd
 $ mkdir mysrc && cd mysrc
 $ echo -e 'MY_LIB_NB=123987' > mylib.sh
 $ echo -e '#!/usr/bin/env bash\nsource mylib.sh\necho "My lib number: $MY_LIB_NB"\necho "I am in $(pwd) and I am running script $(readlink -f $0)"' > myscript.sh
 $ chmod +x myscript.sh
 $ ./myscript.sh
 My lib number: 123987
 I am in /home/me/mysrc and I am running script /home/me/mysrc/myscript.sh

Até aí tudo bem. Agora eu symlink o script para uma pasta bin e execute-o de lá:

$ mkdir bin
$ ln -s $HOME/mysrc/myscript.sh $HOME/mysrc/bin/myscript
$ cd bin
$ ./myscript
./myscript: line 2: mylib.sh: No such file or directory
My lib number: 
I am in /home/me/mysrc/bin and I am running script /home/me/mysrc/myscript.sh

Eu gostaria que meus scripts originais fornecessem arquivos localizados em suas pastas. Existe uma maneira simples de fazer isso, sem ter que fornecer explicitamente caminhos absolutos para o arquivo da biblioteca?

    
por kaligne 31.10.2016 / 15:00

1 resposta

0

Este fragmento de script bash deve ajudar

# get the path to the currently running script:
self=$0 

# test if $self is a symlink:
if [ -L $self ] ; then 
  # readlink returns the path to the file the link points to:
  target='readlink $self' 
else
  target=$self
fi

# strip off the script name from the path:
path='dirname $target' 

# $path/mylib.sh now points to the mylib.sh 
# file in the folder where the original script is:
source $path/mylib.sh 

link

link

    
por 31.10.2016 / 15:22