ForumIn einem Bash Skript das Skriptverzeichnis herausfinden?
Robert Entner – Mittwoch, 27. April 2005 13:40 Uhr

Hallo!

Ich brauche in einem Bash Skript den genauen Pfad in dem das Skript liegt. Normalerweise würde man es mit $0 abfragen, jedoch funktioniert dies nur wenn ich das Skript über den $PATH starte. Wenn ich es direkt starte steht in $0 der Aufrufpfad (den ich mir mit $PWD zu dem Gesamtpfad zusammenstöpseln könnte).

Gibt es da eine elegantere Möglichkeit?

Danke,
Burt

5 Antworten
Alexander Hungenberg – Mittwoch, 27. April 2005 15:22 Uhr

Kann man nicht in Bash Scripts einfach eine Reihe von Befehlen abarbeiten
lassen? Versuch doch mal die Ausgabe von pwd an die Variable weiterzugeben…

mfg
Alex

Andi Kumpf – Mittwoch, 27. April 2005 15:29 Uhr

Tach,
wenn Du den Pfad des Skriptes selbst brauchst, kannst Du den mit
echo $(dirname $0) anzeigen lassen
oder mit
S_PATH=$(dirname $0) in eine Variable schreiben lassen.

Gruß,
Andi

Robert Entner – Mittwoch, 27. April 2005 16:00 Uhr

Hi Andi!

Das funktioniert eben leider nicht so einfach. Sobald das Skript z.B. mit:
# bin/script.sh
aufgerufen wird steht in $0 “bin/script.sh” drinnen. Hier müsste ich $PWD noch vorne dazuhängen. Wenn ich das Skript über den $PATH aufrufe steht in $0 z.B. “/home/username/bin/script.sh”. Offensichtlich muss man hier tatsächlich eine Fallunterscheidung im Skript programmieren.

LG,
Burt

Harald Geiger – Mittwoch, 27. April 2005 16:26 Uhr

Hallo Burt! script_path=`ls -l /proc/$$/fd/255 | sed -e “s/.*-> //”` echo $script_path Funktioniert nicht für Skripte, die ein “-> ” im Namen haben. Und klappt evtl. nur unter Linux, nicht auf anderen UNIX Systemen.

Harald

Robert Entner – Mittwoch, 27. April 2005 18:02 Uhr

Danke für den Tipp. Das funktioniert offensichtlich auch wenn ein Symlink auf das Skript aufgerufen wird anstelle des Skriptes selber. Ich befürchte aber, wie du schon geschrieben hast, dass es mit der Portabilität nicht sehr gut aussieht.

LG,
Burt

Günter – Mittwoch, 27. April 2005 16:31 Uhr

Hallo Burt,

——————
#/bin/bash

cd $(dirname $0)
script_path=$PWD
cd –
——————

Dann steht in script_path was Du suchst.
MfG
Günter

Robert Entner – Mittwoch, 27. April 2005 18:01 Uhr

Hallo Günter!

Sieht sehr gut aus, nur leider funktioniert dies nicht sobald ein Symlink aufgerufen wird der auf das Skript zeigt. Dann bekommt man das Verzeichnis des Links anstelle des Skripts.

LG,
Burt

Günter – Donnerstag, 28. April 2005 04:04 Uhr

Hallo Burt,

aber es funktioniert auch mit Aix und Korn-Shell.

MfG
Günter

Robert Entner – Donnerstag, 28. April 2005 08:52 Uhr

Naja, eben leider nicht. Es liefert nur den Pfad des Symlinks zurück über den ich mein Skript ausführe.

LG,
Burt

Günter – Dienstag, 03. Mai 2005 19:39 Uhr

Das folgende Script funktioniert sowohl unter Suse 9.2 mit bash als auh unter Aix 5.? mit ksh.

——————————————————
#/bin/bash

last_object=$0

while [[ -L $last_object ]]
do
new_file=$(ls -l $last_object)
new_file=${new_file##* }
last_object=$(dirname $last_object)/${new_file##* }
done

cd $(dirname $last_object)
last_object=$PWD/$(basename $last_object)
echo gesucht $(dirname $last_object)

exit
——————————————————-
MfG
Günter