Wie kann ein bash-Skript weiß, das Verzeichnis in dem es installiert ist, wenn es ist sourced . operator?
Was ich möchte zu tun ist, um die Aufnahme von Einstellungen aus einer Datei in meine aktuelle interaktive bash-shell so:
$ . /path/to/some/dir/.Einstellungen
Das problem ist, dass die .Einstellungen-Skript muss auch die". " - operator, der auch andere Dateien wie dieses:
. .extra_settings
Wie kann ich die Referenz der relative Pfad .extra_settings in der .Einstellungen-Datei? Diese beiden Dateien sind immer im gleichen Verzeichnis gespeichert, aber der Pfad zu diesem Verzeichnis wird anders sein, je nachdem, wo diese Dateien installiert wurden.
Der Betreiber weiß immer, den /path/to/some/dir/, wie oben gezeigt. Wie kann die .Einstellungen-Datei wissen, das Verzeichnis, wo es installiert ist? Ich möchte lieber nicht haben ein install-Prozess, die Datensätze, den Namen des installierten Verzeichnis.
InformationsquelleAutor Gary | 2009-01-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube
$(dirname "$BASH_SOURCE")
wird tun, was Sie wollen, solange Sie die Datei, die Sie benötigen ist nicht ein symlink.Wenn die Datei, die Sie benötigen möglicherweise ein symlink ist, können Sie etwas tun, wie die folgenden, um das wahre Verzeichnis:
Zu beheben symlinks könnte man nur tun:
dir=$(dirname $(readlink -f "$BASH_SOURCE"))
InformationsquelleAutor Jason Day
Hier ist, was wäre eine elegante Lösung:
Diese wird jedoch nicht bei der Beschaffung von links. In diesem Fall könnte man tun
Beachten Sie, dass arrays wie
${array[x]}
sind nicht POSIX-konform. Natürlich, dieBASH_SOURCE
array ist nur in Bash.[0]
werden benötigt? @JasonDay hat es nicht in seiner Antwort.BASH_SOURCE ist ein array mit den call-stack mit dem ersten element wird der aktuell ausgeführte Skript.
InformationsquelleAutor Jacob Lee
Eine andere Sicht auf das problem - wenn Sie mit ".", um das setzen von Umgebungsvariablen, eine andere standard-Weg, dies zu tun ist, um Ihr Skript die echo-variable Einstellung-Befehle, z.B.:
dann eval die Ausgabe:
So Pakete wie Module Arbeit. Auf diese Weise macht es auch einfach zu unterstützen Muscheln abgeleitet aus sh (
X=...; export X
) und csh (setenv X ...
)Ich mag diese Idee. Jedoch, ich bin nicht mit, weil die Nebenwirkungen machen würde .Einstellungen-Datei sogar mehr unlesbar, da es ja schon reichlich entweicht, um mit zu beginnen. Siehe unten.
InformationsquelleAutor orip
Ich habe versucht, messing mit Varianten $(dirname $0), aber es schlägt fehl, wenn die .Einstellungen-Datei enthalten ist mit ".". Wenn ich ausführen .Einstellungen-Datei, statt es, diese Lösung würde funktionieren. Stattdessen werden die $(dirname $0) gibt immer ".", Bedeutung aktuelle Verzeichnis. Dieser schlägt fehl, wenn es so etwas wie dieses:
$ cd /
$ . /some/path/.Einstellungen
InformationsquelleAutor Gary
Diese Art von arbeiten. Es funktioniert in dem Sinne, dass Sie können verwenden Sie die $(dirname $0) - syntax innerhalb der .Einstellungen-Datei, um zu bestimmen, seine Heimat, seit Sie das Skript ausgeführt wird in einer neuen shell. Jedoch, es fügt eine zusätzliche Ebene der Faltung, wo Sie brauchen, um die Zeilen zu ändern, wie:
zu
Vielleicht ist das der einzige Weg?
InformationsquelleAutor Gary