Pfad zur aktuellen Programminstallation finden

Hallo Leute

Ich habe ein kleines Problem unter Linux (SuSE SLES9). Eine Anwendung wird in verschiedenen Verzeichnissen parallel installiert. Das Startskript soll in allen Installationen identisch sein, damit der Wartungsaufwand nich allzuhoch wird. Das Startskript soll aber abhängig vom Installationsverzeichnis die richtigen Konfigurationsdateien verwenden.

zur Verdeutlichung:
/opt/app1/bin/start.sh
/opt/app1/bin/app.exe
/opt/app1/conf/config.xml
/opt/app2/bin/start.sh
/opt/app2/bin/app.exe
/opt/app2/conf/config.xml

Wie kann das Startskript nun herausfinden, in welchem Verzeichnis es liegt? Das Skript kann ja im Prinzip von jedem beliebigen Pfad aus aufgerufen werden. D.h. egal ob ich:
/tmp# /opt/app1/bin/start.sh
oder
/opt/app2# …/app1/bin/start.sh
oder
/opt/app1# ./bin/start.sh

ausführe, es soll immer die Anwendung aus dem app1-Verzeichnis und vor allem die Konfigurationsdatei aus /opt/app1/conf genommen werden.

Und wie schon gesagt: die jeweiligen Startskripte müssen identisch bleiben und es soll auch nicht notwendig sein, dem Skript einen Parameter mitzugeben.

Mit $0 bekomme ich ja noch den Dateinamen, mit dem das Skript aufgerufen wurde. Nur wie bekomme ich nun den absoluten Pfadnamen des aktuellen Skripts?

Vielen Dank für die Unterstützung

lg
Erwin

Hallo Erwin,

Mit $0 bekomme ich ja noch den Dateinamen, mit dem das Skript
aufgerufen wurde. Nur wie bekomme ich nun den absoluten
Pfadnamen des aktuellen Skripts?

Wahrscheinlich ein wenig umständlich:

#!/bin/sh
CWD=`pwd`
cd `dirname $0`
DIRNAME=`pwd`
cd $CWD
PFAD=$DIRNAME

In $PFAD steht dann der absolute Pfad, egal woher das Skript aufgerufen wird. Hab es aber nur leicht getestet.

Viele Grüsse
Klaus Bernstein

hi Klaus

jawoll - der hinweis auf das dirname-kommando war genau das richtige. kannte ich noch nicht, sonst wäre ich auf den rest selber draufgekommen. ist auf jeden fall schon mal ein brauchbarer ansatz und hilft mir auf jeden fall weiter.

lg
erwin

meine vorläufige lösung
also, ich mache es mal so:

pushd $(dirname $0) \> /dev/null
PFAD=$PWD
popd \> /dev/null

scheint mir auf basis von dirname der effizienteste code zu sein. falls wer was einfacheres/komfortableres/besseres findet, bitte posten.

lg
erwin

Hallo Erwin,

pushd $(dirname $0) > /dev/null
PFAD=$PWD
popd > /dev/null

scheint mir auf basis von dirname der effizienteste code zu
sein. falls wer was einfacheres/komfortableres/besseres
findet, bitte posten.

Glaub nicht, dass es noch effizienter und vor allem eleganter geht.
Jetzt hast Du mich endlich wieder an

pushd

und

popd

erinnert. Das vergesse ich nämlich immer wieder :frowning:
Danke
Klaus Bernstein

Hallo Erwin.

pushd $(dirname $0) \> /dev/null
PFAD=$PWD
popd \> /dev/null

scheint mir auf basis von dirname der effizienteste code zu
sein. falls wer was einfacheres/komfortableres/besseres
findet, bitte posten.

Deine Version ist schon mal nicht schlecht, aber diese
/dev/null-Fummelei gefällt mir nicht.

Ich schlage folgenden Einzeiler vor:

PFAD=$( cd $(dirname $0) && pwd );

Hier noch ein paar Tests:

# pwd
/home/andreas

# echo $0
/bin/bash

# echo $( cd $(dirname $0) && pwd );
/bin

Wenn man sich die C-Implementierung von pwd und der davon aufgerufenen
libc-Funktion getcwd() unter Linux ansieht, entspricht obige Zeile der Low-Level-Variante:

# echo $( cd $(dirname $0) && readlink /proc/self/cwd ); 
/bin

Mit der letzten Version bist Du dann der Partyheld beim nächsten
Linux-User-Group-Treffen :wink:

Gruß,
-Andreas.

2 Like

Hallo Erwin und Andreas,

Glaub nicht, dass es noch effizienter und vor allem
eleganter geht.

Ja, ich falle vom Glauben ab :wink: Andreas hat doch die Linux-User-Party-Krone verdient…

Viele Grüsse
Klaus Bernstein