Ich habe einen symbolischen Link zu einer ausführbaren Datei erstellt mit
ln -s /usr/bin/mydir/myexec /usr/bin/myexec
Bei der Ausführung myexec
in Bash werden nicht die richtigen Dateien geladen, die sich im ursprünglichen myexec
Verzeichnis befinden.
Warum passiert das und wie kann ich es lösen? Ich verwende Fedora 15 x64.
Antwort1
Dateien, die mit relativen Pfaden aufgerufen werden, /usr/bin/mydir/myexec
werden relativ zum aktuellen Arbeitsverzeichnis gesucht, aus dem das Skript ausgeführt wird. Wahrscheinlich funktioniert Ihr Skript derzeit nur, wenn es /usr/bin/mydir
gerade ausgeführt wird.
Eine Möglichkeit, dies zu lösen, besteht darin, absolute Pfade zu den enthaltenen Dateien anzugeben (das Skript muss dann jedoch aktualisiert werden, wenn die gewünschten Dateien jemals verschoben werden), oder Sie müssen den absoluten Pfad dynamisch ermitteln readlink
, z. B. mit
THISFILE=$(readlink -f -- "${0}")
THISDIR=${THISFILE%/*}
. "${THISDIR}/my_settings_file"
readlink -f
gibt das Ziel des symbolischen Links zurück.- Das
${THISFILE%/*}
gibt das Ziel des symbolischen Links mit dem Teil zurück, der den letzten/
entfernt hat, also den Pfad zur betreffenden Datei. ${THISDIR}
enthält jetzt den absoluten Pfad zur Datei und kann wie in Zeile 3 verwendet werden.
Ich ging davon aus, dass sich die Frage auf ein Shell-Skript bezog. In anderen Sprachen können andere Methoden zum Einsatz kommen.
Eine andere Möglichkeit, das Problem mehr oder weniger vollständig zu vermeiden, besteht darin, statt eines symbolischen Links auf die Binärdatei in Ihrem Pfad ein kleines Skript zu erstellen, /usr/bin/myexec
das beispielsweise Folgendes enthält:
#!/bin/sh
cd /usr/bin/mydir
./myexec
Antwort2
Ich stimme @daniel-anderson nicht zu. Ich glaube nicht, dass diese Lösungen die Argumente des aufgerufenen Programms richtig berücksichtigen. Fast alle ausführbaren Dateien behandeln Pfadargumente als relativ zum aktuellen Verzeichnis, daher funktioniert selbst die Weitergabe der Argumente nicht.
Der einzige Fall, in dem sich ein Programm anders verhält, wenn es von a aufgerufen wird, symlink
ist, wenn es das 0. Argument untersucht. Ich kenne keine Möglichkeit, dies mithilfe eines symbolischen Links zu umgehen. Die einfachste Lösung besteht darin, ein Zwischen-Shell-Skript in folgender Form zu erstellen:
#!/bin/sh
/path/to/executable/that/needs/0th/argument/to/be/actual/path $@
Beachten Sie: Wenn Sie aus irgendeinem bizarren Grund ein 0. Argument angeben müssen, das sich nicht dort befindet, wo es sich tatsächlich befindet, können Sie „exec -a“ wie folgt verwenden:
#!/bin/bash
(exec -a /path/to/executable/to/fool /path/to/fool/executable/with $@)
Beachten Sie, dass das Argument „-a“ möglicherweise nicht streng POSIX-spezifiziert ist, daher habe ich speziell bash verwendet. Vorausgesetzt, Sie haben einen ~/bin-Ordner in Ihrem Pfad, kann der erste (normale) Fall schnell wie folgt erreicht werden:
echo -e '#!/bin/sh\n/path/to/executable $@' > ~/bin/shortcut
chmod 755 ~/bin/shortcut
shortcut