Ist es möglich, dass ein Shell-Skript seinen Speicherort kennt? Ich habe gelesen , um sourced Shell - Skript zu bestimmen Pfad aber die Antworten konzentrieren sich auf bash
und tcsh
und fehlschlagen , wenn ein POSIX - Shell verwendet wird. $0
ist auch nicht die Lösung und liefert falsche Ergebnisse .
Eine Lösung muss nicht 100% zuverlässig sein. Es ist unwahrscheinlich, dass der Pfad Hard- oder Symlinks enthält.
# sourcing the script should yield the absolute path to the script
. somedir/thescript
# within “thescript”
-> /tmp/foo/bar/somedir
Einige Hintergrundinformationen: Das Skript ist Teil einer vorhandenen Anwendung, die Dutzende von Binärdateien in einem bin
Verzeichnis an einem bekannten Speicherort enthält (variiert je nach Architektur), bezogen auf das Quellenskript. Um die Anwendung zu verwenden, bezieht der Benutzer das Skript, mit dem das bin
Verzeichnis vorangestellt wird PATH
, sodass die Binärdateien der Anwendung problemlos in der aktuellen Shell (je nachdem, welche Shell sich befindet) aufgerufen werden können.
. /path/to/script
alsMARCO_DIR=/path/to; . $MARCO_DIR/script
oder zu tuneval "$(/path/to/script)"
? @ RahulPatilBASH_SOURCE
ist offensichtlich spezifisch für Bash.Antworten:
Der Speicherort des Skripts ist nur verfügbar, wenn Sie eine Shell verwenden, die Erweiterungen der POSIX-Spezifikation bietet. Sie können dies mit dem folgenden Snippet testen:
wo
included.sh
enthältIn bash ist der Name des Skripts in
$BASH_SOURCE
. In zsh (im zsh-Kompatibilitätsmodus, nicht im sh- oder ksh-Kompatibilitätsmodus) ist es in$0
(beachten Sie, dass in einer Funktion$0
stattdessen der Funktionsname angegeben ist). In pdksh und dash ist es nicht verfügbar. In ksh93 zeigt diese Methode die Lösung nicht an, aber der vollständige Pfad zum enthaltenen Skript ist verfügbar als${.sh.file}
.Wenn es gut genug ist, bash oder ksh93 oder zsh zu benötigen, können Sie dieses Snippet verwenden:
Sie können versuchen, den Speicherort des Skripts zu erraten, indem Sie sich ansehen, welche Dateien die Shell geöffnet hat. Experimentell scheint dies mit dash und pdksh zu funktionieren, aber nicht mit bash oder ksh93, die zumindest für ein kurzes Skript die Skriptdatei geschlossen haben, bis sie zur Ausführung kommen.
Das Skript ist möglicherweise nicht die Datei mit dem Deskriptor mit der höchsten Nummer, wenn das Skript in einem komplexen Skript enthalten ist, das mit Umleitungen gespielt hat. Möglicherweise möchten Sie die geöffneten Dateien durchlaufen. Dies funktioniert ohnehin nicht garantiert. Die einzige zuverlässige Möglichkeit, ein Sourcing-Skript zu finden, ist die Verwendung von bash, ksh93 oder zsh.
Wenn Sie die Benutzeroberfläche ändern können, lassen Sie Ihr Skript anstelle der Beschaffung Ihres Skripts ein Shell-Snippet ausdrucken, an das es
eval
im Aufrufer übergeben werden soll. Dies ist, was Skripte zum Festlegen von Umgebungsvariablen normalerweise tun. Damit kann Ihr Skript unabhängig von den Abweichungen der Shell und der Shell-Konfiguration des Aufrufers geschrieben werden.Im Anrufer:
eval "`/path/to/setenv`"
quelle
Wenn Sie Gilles Antwort hinzufügen, können Sie möglicherweise das Shell-Skript (
if $0 = ash
) über die/proc/$$ interface
. Ich weiß nicht, wie genau das ist, aber es/proc/$$/fd/11
scheint immer auf dieses Skript mit BusyBox 'Asche zu verweisen.Bereitstellung als mögliche Antwort für diejenigen, die auf diese Seite stoßen (wie ich).
Die letzte Antwort wurde gelöscht - daher wird mein Anspruch auf diese Arbeit auf 4 verschiedenen HW-Plattformen (x86, ARM, XLP und PowerPC) getestet. Alle geben die gleiche Antwort von fd / 11. Ein Readlink von
/proc/$$/fd/11
liefert mein Skript.Andy
quelle