Das Programm läuft bei direktem Zugriff, jedoch nicht bei Zugriff über einen symbolischen Link.

Das Programm läuft bei direktem Zugriff, jedoch nicht bei Zugriff über einen symbolischen Link.

Ich habe eine Ruby-Anwendung installiert /home/anp/toolsund 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:

  1. Die Schale dehnt sich aus ~und Sie laufen richtig los /home/anp/tools/wwan.
  2. Das Tool startet. Es weiß, dass es /home/anp/tools/wwan(z. B. aufgrundargv[0]).
  3. Das Tool findet den Verzeichnisteil der obigen Zeichenfolge und ändert sein eigenes Arbeitsverzeichnis entsprechend: /home/anp/tools/.
  4. 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/wwanoder ausführen wwan(wobei /usr/binsich in befindet $PATH), beginnt das Szenario mit /usr/bin/wwanund 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/wwanals 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 execausgeführt /home/anp/tools/wwanund dies ist die Zeichenfolge, mit der das Tool arbeitet, also sollte es funktionieren. Alle (null oder mehr) Argumente, die Sie angeben, /usr/bin/wwanwerden /home/anp/tools/wwandank 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.

verwandte Informationen