1

У меня есть мой основной скрипт, который получает файл Bash в той же папке:

 $ 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

Все идет нормально. Теперь я связываю скрипт с папкой bin и запускаю ее оттуда:

$ 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

Я хотел бы, чтобы мои оригинальные сценарии исходных файлов, расположенных в их папке. Есть ли простой способ сделать это, без необходимости явно указывать абсолютные пути к файлу библиотеки?

1 ответ1

1

Этот фрагмент скрипта bash должен помочь

# 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 

http://man7.org/linux/man-pages/man1/readlink.1.html

http://man7.org/linux/man-pages/man1/dirname.1.html

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .