PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Verzeichnis eines ShellSkripts



klattenhoff
21-06-2007, 09:44
Hi @ll,

ich habe mehrere voneinander abhängige Shellskripte, die mit weiteren benötigten Dateien in einem Verzeichnis liegen.

Nun möchte ich aber nicht vorgeben, daß die Nutzer dieses Skript immer nur aus diesem Verzeichnis ausführen können, sondern aus jeden beliebigen... Da die Pfadangaben aber über eine Konfigurationsdatei vorgegeben sind, muss ich diese ja einlesen. Das will ich nun aber nicht mit einem absoluten Verweis machen, sondern relativ.

Wenn ich nun das Skript aber aus einem anderen Verzeichnis aufrufe meldet er mir, daß er die Konfigurationsdatei nicht finden kann.

Aus dem Grund suche ich eine Funktion, die ich im ShellSkript selbst aufrufen kann und die mir sagt, wo dieses ShellSkript eigentlich liegt...

Gibt es so etwas?

pwd etc. schaffen das meiner Meinung nach nicht, da sie immer das Verzeichnis ausgeben, in dem ich den Aufruf eingetragen hab, sprich wenn ich die test.sh aus dem rootverzeichnis her aufrufe (HOST:/ # /opt/test/test.sh) bekomme ich bei einem pwd in der test.sh nur "/" angegeben...

Wäre super wenn jemand eine Lösung hätte :-)

thanx in advance

Pingu
21-06-2007, 10:46
Der Null-Parameter ist immer der Dateiname
#!/bin/bash
#
# Das Skript macht ein Backup der MySQL-Database nach /backup
#

# #### Konfiguration
BASE_PATH=`echo $0 | sed -e "s/^\(.*\).etc.cron.*$/\1/"`
# BASE_PATH=`pwd | sed -e "s/(.*)\/etc\//1/"`
BACKUP_PATH=$BASE_PATH/backup
MYSQL_DB=pingu
MYSQL_USER=pingu
MYSQL_PASS=*****
MYSQL_PORT=3306
DATE=`date -I`

klattenhoff
21-06-2007, 12:29
Hi Pingu,

danke für die Antwort, auf die Idee bin ich zwischenzeitlich auch gekommen, hänge aber nun am nächsten (ich mag kein sed...).

SCRIPTPFAD=""
PFADTEST=`echo $0 | grep "\./"`
if [ ${PFADTEST}" != "" ]; then
STARTPFAD="`pwd`"
SCRIPTPFAD=`echo $0 | sed s/'\.\/'/${STARTPFAD}/g`
fi

Bei dem blöden sed steigt er mir aus, weil er mit ${STARTPFAD} nichts anfangen kann... Wenn ich STARTPFAD aber nicht mit "`pwd`" sondern mit einem festen String befülle klappt es...

Wo liegt mein Fehler?

klattenhoff
21-06-2007, 12:40
Nach ein bißchen ausprobieren hat es dann doch geklappt (vielleicht nicht die schönste Art, aber gehen tuts :-) )



SCRIPTPFAD="${0}"
PFADTEST=`echo $0 | grep "\./"`
if [ ${PFADTEST}" != "" ]; then
STARTPFAD="`pwd`"
SCRIPTPFAD=`echo ${STARTPFAD}${0} | sed s/'\.\/'/"\/"/g`
fi


Nochmals danke

jan61
27-06-2007, 17:24
Moin,

hier noch 2 Ansätze:

1. Wenn Dein Scriptpfad in $PATH enthalten ist, dann kriegst Du den Pfad schneller so raus:
PFAD=`dirname \`which $0\``2. Mit einem cd in einer Subshell:
PFAD=`(cd \`dirname $0\` && pwd)` Die Subshell deshalb, damit Du nicht im laufenden Script im Programmverzeichnis landest - das ginge aber auch, wenn nicht andere Gründe dagegen sprechen.

Jan

jan61
27-06-2007, 19:12
Nach ein bißchen ausprobieren hat es dann doch geklappt (vielleicht nicht die schönste Art, aber gehen tuts :-) )



SCRIPTPFAD="${0}"
PFADTEST=`echo $0 | grep "\./"`
if [ ${PFADTEST}" != "" ]; then
STARTPFAD="`pwd`"
SCRIPTPFAD=`echo ${STARTPFAD}${0} | sed s/'\.\/'/"\/"/g`
fi
Nochmals danke

Ein bisschen Krittelei noch ;-) Du machst Dir die Arbeit unnötig schwer. Du brauchst eigentlich nur zu prüfen, ob das Script mit einem absoluten Pfad aufgerufen wird. In allen anderen Fällen kannst Du einfach den Pfad des Scripts hinter die Ausgabe von pwd hängen, ein Pfad wie /pfad/zum/pwd/../relativer/pfad/zum/script oder /pfad/zum/pwd/. ist nämlich gültig. Also ungefähr so:

SCRIPTPFAD=`dirname "$0"`
echo "$SCRIPTPFAD" | grep -q '^/' || SCRIPTPFAD=`pwd`/$SCRIPTPFADJan