Website-Suche

So ermitteln Sie in einem Bash-Skript den Pfad, in dem sich das Skript befindet


Wenn Sie komplexe Bash-Skripte entwickeln und damit beginnen, verschiedene Skripte in einen Ordner zu legen, in dem ein Skript mit einem anderen interagiert, indem Sie es beispielsweise starten, wird es schnell notwendig, sicherzustellen, dass wir den Pfad kennen, von dem aus das Skript gestartet wurde, damit wir die anderen Skripte mit einem vollständig qualifizierten Pfadnamen starten können. Dies ist wichtig, da das erste Skript möglicherweise von außerhalb des Verzeichnisses des Skripts gestartet wurde. Wir hätten dies auch mit einem relativen Pfad tun können, so dass selbst – irgendwie – das Lesen des Befehls, der das aktuelle Skript gestartet hat, nicht funktioniert.

In diesem Tutorial lernen Sie:

  • Was der Befehl pwd ist und was er bewirkt
  • So ermitteln Sie in einem Bash-Skript, in welchem Pfad sich dasselbe Skript befindet

So ermitteln Sie in einem Bash-Skript den Pfad, in dem sich das Skript befindet

Verwendete Softwareanforderungen und Konventionen

Was ist pwd?

Der Befehl pwd in Linux gibt bei der Ausführung das Pfad-Arbeitsverzeichnis zurück. Unabhängig davon, auf welchem Pfad wir uns gerade befinden und zu dem wir zuvor navigiert sind (oder in den wir von unserem Betriebssystem versetzt wurden, wie zum Beispiel, wenn wir eine Eingabeaufforderung/ein Terminal öffnen), wird das zurückgegeben, was zurückgegeben wird, wenn wir pwd ausführen.

cd /
pwd
/
cd /home
pwd
/home

Hier wechselten wir in das Stammverzeichnis (/) und führten pwd aus. Unser aktueller Pfad war das Stammverzeichnis, daher wird / zurückgegeben. Wir wechselten dann in das Verzeichnis /home und führten pwd erneut aus. Der zurückgegebene Pfad lautet jetzt /home.

In einem Bash-Skript funktioniert der Befehl pwd auf die gleiche Weise. Es ist auch erwähnenswert zu wissen, dass wir innerhalb eines Bash-Skripts (und auch auf der Befehlszeile außerhalb eines Bash-Skripts) die spezielle Betriebssystemvariable $ {PWD} verwenden können, die vom Betriebssystem automatisch auf dem neuesten Stand gehalten wird, um unseren aktuellen Pfad zu enthalten. Dies erspart uns so etwas wie den Aufruf einer Subshell, d.h. MYPATH="$ (pwd)" wird nicht benötigt, wir können einfach die Variable $ {PWD} aufrufen.

Wir können also pwd verwenden, oder?

Nicht genau. Stellen Sie sich folgende Situation vor:

touch 'mypath.sh'
echo '#!/bin/bash' >> mypath.sh
echo 'echo ${PWD}' >> mypath.sh
chmod +x mypath.sh 

Hier haben wir ein Skript mit dem Namen mypath.sh definiert und es ausführbar gemacht. Als nächstes springen wir ein Verzeichnis aus unserem Home-Verzeichnis nach oben und führen unser Skript aus:

pwd 
/home/roel
cd ..
./roel/mypath.sh 
/home

Während der pwd-Befehl in unserem mypath.sh Skript korrekt funktioniert, gibt es hier ein Problem: pwd hat den Pfad zurückgegeben, in dem wir uns gerade befinden, nämlich /home, während das Skript tatsächlich im Verzeichnis /home/roel gespeichert ist!

Merken Sie sich den Titel des Artikels; Wir suchen nach dem Pfad, in dem das Skript gespeichert ist! Wie können wir das also finden?

Die Methode!

Während es in Bash keine spezielle Variable gibt, die den Pfad abdeckt, in dem das Skript gespeichert ist, gibt es eine einfache Methode, um es abzurufen.

cd -
/home/roel
touch 'mypath2.sh'
echo '#!/bin/bash' >> mypath2.sh
echo 'MYPATH="$(cd "$(dirname \$0)" && pwd)"' >> mypath2.sh 
echo 'echo "${MYPATH}"' >> mypath2.sh
chmod +x mypath2.sh 

Hier haben wir ein sekundäres Skript mit dem Namen mypath2.sh definiert. Darin platzieren wir einen kleinen speziellen Code (&#36 (cd "&#36 (dirname \$0)"; && pwd)), der den Pfad findet, in dem sich das Skript befindet (indem er in sein Verzeichnis wechselt, basierend auf der Variablen \$0 (das ist der Skriptname in der Weise, wie wir ihn genannt haben, d.h. mit einem potentiellen relativen oder vollständig qualifizierten Pfad) und den dirnamen dafür anfordert (durch Referenz, und beachten Sie, dass es sich immer noch um einen relativen Pfad handeln kann, wenn das Skript mit einem relativen Pfad gestartet wurde) und dann (über die CD) in diesen wechselt und anschließend das pwd (Path Working Directory) für denselben anfordert, wodurch wir den vollständig qualifizierten Pfad erhalten.

Schauen wir uns an, ob dies korrekter funktioniert als nur die Verwendung von pwd:

cd ..
pwd
/home
./home/mypath2.sh 
/home/roel

Das Skript funktioniert ordnungsgemäß, und obwohl mypath2.sh relativ aufgerufen wurde, von außerhalb des Verzeichnisses, in dem sich das Skript befindet, gab die zurückgegebene Ausgabe die gesuchten Informationen korrekt wieder. Der Pfad, in dem sich das Skript befindet. Wir haben dasselbe in der Variablen $ {MYPATH} gespeichert, und diese Variable könnte nun verwendet werden, um beispielsweise $ {MYPATH}/someotherscript.sh aufzurufen, wobei someotherscript.sh ein anderes Skript im selben Verzeichnis wie mypath2.sh

Schlussfolgerung

In diesem Artikel schauen wir uns zunächst pwd an und ob es das vorliegende Problem lösen würde, indem wir jederzeit herausfinden, in welchem Pfad sich unser Skript befindet. Während pwd möglicherweise funktioniert, wenn wir das Verzeichnis nicht geändert haben, funktioniert es nicht korrekt, wenn wir uns außerhalb des Pfads befinden, in dem sich das Skript befindet. Wir haben dann ein kleines Stück Code (MYPATH="&#36 (cd "&#36 (dirname \$0)" && pwd) eingeführt, das immer das Verzeichnis zurückgibt, in dem sich unser Skript befindet.

Ein kleines Stück Code, aber eine große Lösung für unser Problem mit der Bash-Skriptcodierung! Guten Appetit!

Verwandte Artikel: