![Wie ruft man ein Skript mit einem relativen Pfad auf, dessen übergeordnetes Verzeichnis in PATH abgebildet ist?](https://rvso.com/image/1552392/Wie%20ruft%20man%20ein%20Skript%20mit%20einem%20relativen%20Pfad%20auf%2C%20dessen%20%C3%BCbergeordnetes%20Verzeichnis%20in%20PATH%20abgebildet%20ist%3F.png)
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 .PATH
do_something.sh
/usr/bin/vendor/some_tool/
/usr/bin/vendor/some_tool/do_a.pl
/usr/bin/vendor/some_tool/do_b.pl
Dank PATH
kann ich es do_something.sh
überall problemlos aufrufen. Aber gibt es eine Möglichkeit, es some_tool/do_a.pl
auf dieselbe Weise aufzurufen? Tatsächlich some_tool/do_a.pl
mit diesem relativen Pfad, damit ich weiß, dass ich die Aufgabe do_a
von 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.sh
die alle Argumente an weiterleitet /usr/bin/vendor/some_tool/do_a.pl
.
Antwort1
Die bash
Manpage 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 PATH
von 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
tl
würde den übergebenen Parameter analysieren, schrittweise PATH
in 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.