Wie ruft man ein Skript mit einem relativen Pfad auf, dessen übergeordnetes Verzeichnis in PATH abgebildet ist?

Wie ruft man ein Skript mit einem relativen Pfad auf, dessen übergeordnetes Verzeichnis in PATH abgebildet ist?

Ich habe einen Ordner , der per Konvention /usr/bin/vendor/zu hinzugefügt wird und beispielsweise das Shell-Skript enthält . Nun möchte ich einen Unterordner hinzufügen, um zusätzlich ein oder mehrere Perl-Skripte gruppiert zu speichern, da sie denselben Zweck haben und ich zusätzlich Eclipse-Projektdateien, vielleicht sogar Konfigurationsdateien usw. verwalten muss. Am Ende erhalte ich möglicherweise und .PATHdo_something.sh/usr/bin/vendor/some_tool//usr/bin/vendor/some_tool/do_a.pl/usr/bin/vendor/some_tool/do_b.pl

Dank PATHkann ich es do_something.shüberall problemlos aufrufen. Aber gibt es eine Möglichkeit, es some_tool/do_a.plauf dieselbe Weise aufzurufen? Tatsächlich some_tool/do_a.plmit diesem relativen Pfad, damit ich weiß, dass ich die Aufgabe do_avon erledige some_tool. Es ist im Wesentlichen eine Formulierungs-/Namenskonvention, die ich mithilfe der relativen Verzeichnisstruktur implementieren möchte.

Habe das auf der Shell versucht und es hat natürlich nicht funktioniert, aber vielleicht mache ich etwas falsch und es sollte im Allgemeinen funktionieren. Aber ich vermute, es sollte nicht und die einzige Problemumgehung wäre, eine Datei zu erstellen, /usr/bin/vendor/some_tool_do_a.shdie alle Argumente an weiterleitet /usr/bin/vendor/some_tool/do_a.pl.

Antwort1

Die bashManpage gibt an

   PATH   The  search  path for commands.  It is a colon-separated list of
          directories in which the shell looks for commands  (see  COMMAND
          EXECUTION  below).

Weiter heißt es:

   If  the name is neither a shell function nor a builtin, and contains no
   slashes, bash searches each element of the PATH for  a  directory  con‐
   taining  an  executable  file  by that name.

Die Antwort scheint also zu sein: „Nein, was Sie tun möchten, wird von nicht unterstützt bash.“

Antwort2

Nein, das ist nicht möglich: Jedes Element /in Ihrem eingegebenen Befehl macht daraus einen absoluten Pfad (wenn /das erste Zeichen ist) oder einen relativen Pfad in Bezug auf Ihr aktuelles Verzeichnis, nicht einen relativen Pfad innerhalb PATHvon Einträgen.

Eine Problemumgehung könnte darin bestehen, alle Skripte wie /usr/bin/vendor/some_tool/folgt zu verknüpfen /usr/bin/vendor/:

ln [-s] /usr/bin/vendor/some_tool/* /usr/bin/vendor/

Es können entweder Hardlinks oder Softlinks verwendet werden.

Wenn Sie sich beim Aufrufen des Skripts immer im selben Arbeitsverzeichnis (oder einer kleinen Anzahl von Verzeichnissen) befinden, könnte eine einfachere Lösung darin bestehen, einen relativen Link von diesem (oder jedem) Verzeichnis zu erstellen:

ln -s /usr/bin/vendor/some_tool .

In diesem Fall müssen Sie symbolische Links verwenden.

Andere Problemumgehungen könnten darin bestehen, zur Ausführung dieser Funktion ein Skript mit einem Kurznamen zu definieren, das Sie etwa mit folgendem aufrufen würden:

tl some_tool/do_a.pl

tlwürde den übergebenen Parameter analysieren, schrittweise PATHin jeder Komponente nach dem Skript suchen und dann den vollständigen Pfad zum Skript aufrufen.

Antwort3

Was ich im „Haupt“-Skript mache:

mydir=$(dirname "$0")
"$mydir/subdir/otherscript"

dann findet das Hauptskript das untergeordnete Element immer, solange sie zusammen verschoben werden, sodass sich ihre relative Position nicht ändert.

verwandte Informationen