
Ich habe eine Ruby-Anwendung installiert /home/anp/tools
und dann wie folgt einen symbolischen Link erstellt:
ln -s /home/anp/tools/wwan /usr/bin/wwan
Wenn ich ausführe ~/tools/wwan
, läuft es einwandfrei.
Wenn ich versuche, es über den symbolischen Link auszuführen, erhalte ich die Fehlermeldung
solche Datei kann nicht geladen werden – lib/wwan
Sollte das nicht so funktionieren? Verursacht der symbolische Link Probleme, wenn das Programm versucht, relative Dateipfade aufzulösen?
Antwort1
Verursacht der symbolische Link Probleme, wenn das Programm versucht, relative Dateipfade aufzulösen?
Es kann sein. In diesem Fall ist es höchstwahrscheinlich so.
Plausibles Szenario beim Ausführen ~/tools/wwan
:
- Die Schale dehnt sich aus
~
und Sie laufen richtig los/home/anp/tools/wwan
. - Das Tool startet. Es weiß, dass es
/home/anp/tools/wwan
(z. B. aufgrundargv[0]
). - Das Tool findet den Verzeichnisteil der obigen Zeichenfolge und ändert sein eigenes Arbeitsverzeichnis entsprechend:
/home/anp/tools/
. - Das Tool verweist über einen relativen Pfad auf ein zusätzliches Asset:
lib/wwan
. Das Asset befindet sich tatsächlich in/home/anp/tools/lib/wwan
, es funktioniert also.
Aber wenn Sie /usr/bin/wwan
oder ausführen wwan
(wobei /usr/bin
sich in befindet $PATH
), beginnt das Szenario mit /usr/bin/wwan
und endet mit /usr/bin/lib/wwan
, das nicht als Datei vorhanden ist. Das Asset ist nicht vorhanden.
Die Details können unterschiedlich sein, aber ein solches Problem mit einem symbolischen Link deutet darauf hin, dass das Tool den Link nicht dereferenziert, obwohl es das sollte. Wenn es das täte, würde es immer funktionieren, /home/anp/tools/wwan
als ob Sie ausführen würden /home/anp/tools/wwan
. Ich würde sagen, dass das, was Sie erlebt haben, ein Fehler ist.
Eine Möglichkeit, damit umzugehen, besteht darin, das Tool selbst zu verbessern (seinen Code zu bearbeiten), damit es seinen tatsächlichen Pfad richtig findet.
Eine andere Möglichkeit besteht darin, anstelle eines symbolischen Links ein Wrapper-Skript zu verwenden. Entfernen Sie den symbolischen Link und erstellen Sie ein Skript mit dem Namen /usr/bin/wwan
. Der Inhalt des Skripts:
#!/bin/sh
exec /home/anp/tools/wwan "$@"
Machen Sie es ausführbar. Wenn Sie jetzt aufrufen /usr/bin/wwan
, wird das Skript exec
ausgeführt /home/anp/tools/wwan
und dies ist die Zeichenfolge, mit der das Tool arbeitet, also sollte es funktionieren. Alle (null oder mehr) Argumente, die Sie angeben, /usr/bin/wwan
werden /home/anp/tools/wwan
dank an an übergeben "$@"
.
Anmerkungen:
/usr/bin/
ist ein systemweiter Speicherort für ausführbare Dateien. Von dort aus auf ein Tool zu verlinken, das sich in Ihrem Home-Verzeichnis befindet, ist im Allgemeinen keine gute Praxis; das Gleiche gilt für das Wrapping.- Ein Wrapper-Skript ist eine separate normale Datei. Seine Eigentümerschaft und Berechtigungen sind unabhängig von denen der Ziel-Programmdatei. Stellen Sie sie richtig ein.