Ausführbare Datei kann beim Aufruf über symbolischen Link die richtigen Dateien nicht finden

Ausführbare Datei kann beim Aufruf über symbolischen Link die richtigen Dateien nicht finden

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 myexecin Bash werden nicht die richtigen Dateien geladen, die sich im ursprünglichen myexecVerzeichnis 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/myexecwerden relativ zum aktuellen Arbeitsverzeichnis gesucht, aus dem das Skript ausgeführt wird. Wahrscheinlich funktioniert Ihr Skript derzeit nur, wenn es /usr/bin/mydirgerade 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 -fgibt 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/myexecdas 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, symlinkist, 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

verwandte Informationen