Suchpfad der Quelldatei von symlink

652
kaligne

Ich habe mein Hauptskript, das eine Bash-Datei im selben Ordner enthält:

 $ 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 

So weit, ist es gut. Jetzt verknüpfe ich das Skript mit einem bin-Ordner und führe es von dort aus:

$ 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 

Ich möchte, dass meine Originalscripts Quelldateien in ihrem Ordner enthalten. Gibt es eine einfache Möglichkeit, dies zu tun, ohne explizit absolute Pfade zur Bibliotheksdatei angeben zu müssen?

0
Verknüpfen Sie auch Ihr anderes Zeug oder verknüpfen Sie mit `cd 'den Pfad von` $ 0', um das Arbeitsverzeichnis in das Verzeichnis zu ändern, in dem sich das Skript anstelle des Symlink-Speicherorts befindet. Seth vor 8 Jahren 0

1 Antwort auf die Frage

0
user7037

Dieses Bash-Skriptfragment sollte helfen

# 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

Danke, dass ich darüber nachgedacht habe, falls keine ursprüngliche Antwort auftauchen würde. SO denke ich, dass dies die einfachste Möglichkeit ist. Ps: Ihre Links sind tot! kaligne vor 8 Jahren 0
Es ist am besten, die Einfachheit der Originalität vorzuziehen. Ersteres ist tendenziell zuverlässiger. :) Ich habe die Links behoben. Vielen Dank. user7037 vor 8 Jahren 0