Путь поиска исходного файла символической ссылки

507
kaligne

У меня есть мой основной скрипт, который получает файл 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 

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

0
Используйте также ссылки на другие ваши материалы или, как вы можете видеть из выходных данных, `cd` на путь` $ 0`, чтобы изменить ваш рабочий каталог на каталог, в котором находится скрипт, а не на местоположение символической ссылки. Seth 7 лет назад 0

1 ответ на вопрос

0
user7037

Этот фрагмент скрипта 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

Спасибо, я думал об этом, если бы не появилось никакого оригинального ответа. Пока я думаю, что это самый простой способ сделать это. Ps: ваши ссылки мертвы! kaligne 7 лет назад 0
Лучше всего отдавать предпочтение простоте, а не оригинальности. Первый имеет тенденцию быть более надежным. :) Я исправил ссылки. Благодарю. user7037 7 лет назад 0

Похожие вопросы