#!/bin/bash
echo "Das Skript mit Pfad heisst $0"
echo "Das Skript ohne Pfad heisst ${0##\*/}"
echo "Der Pfad heisst ${0%/\*}"
funktioniert mit Parametersubstitution:
##Muster sucht nach dem längstmöglichen Muster (hier also der gesamte Pfad bis zum letzten / und entfernt es
%Muster sucht nach dem kürzestmöglichen Muster, aber vom Stringende her und entfernt es. Hier wird also der Dateiname entfernt, so daß nur der Pfad übrigbleibt.
Ist im Prinzip die Substitution von Rainer, nur ohne Fallunterscheidung. Funktioniert hoffentlich trotzdem in allen Lebenslagen.
Noch mehr Substitutionen gibt es z.B. hier: http://tldp.org/LDP/abs/html/parameter-substitution…
Danke, klappt super, aber wenn ich ehrlich bin, habe ich die Fallunterscheidung nicht so ganz verstanden, kannst Du dazu nochmal ne kurze Zeile schreiben?
leider hat $0 nur den reinen Scriptnamen drinnen, so dass ein
„Auseinandernehmen“ nicht klappt.
Ist das Distriabhängig?
Das hängt davon ab, wie du das Skript aufrufst. Liegt es im aktuellen Verzeichnis und du gibst „./script“ ein, dann ist $0=./script. Liegt es in einem der Verzeichnisse aus $PATH, und du rufst es mit „script“ auf, dann enthält $0 den vollen Pfad. Ruft man es mit „sh script“ auf, dann ist $0=script.
Die case-Struktur in meinem Vorschlag erschlägt die beiden ersten Fälle. Damit es auch den dritten Fall richtig behandelt, muss man den case-Block wie folgt ändern:
case "$0" in
/\* ) MyFullPathName="$0" ;;
./\* ) MyFullPathName="$PWD/${0#./}" ;;
\* ) MyFullPathName="$PWD/$0";;
esac
Danke, klappt super, aber wenn ich ehrlich bin, habe ich die
Fallunterscheidung nicht so ganz verstanden, kannst Du dazu
nochmal ne kurze Zeile schreiben?
case "$0" in
/\* ) MyFullPathName="$0" ;;
./\* ) MyFullPathName="$PWD/${0#./}" ;;
\* ) MyFullPathName="$PWD/$0";;
esac
Das Case-Statement vergleicht $0 nacheinander mit den Mustern „/*“, „./*“ und „*“, und liefert den vollständigen Pfad in MyFullPathName.
Fall 1: $0 beginnt mit „/“. $0 enthält also den kompletten Pfad. Nichts ist zu tun
Fall 2: $0 beginnt mit „./“. $0 enthält eine relative Pfadangabe, d.h. relativ zum aktuellen Verzeichnis. Entferne das „./“ am Anfang und ergänze das Ergebnis mit pwd zum kompletten Pfad.
Hinweis: # in den geschweiften Klammern enfernt die nachfolgende Zeichenfolge vom Anfang der Variablen (könnte man auch mit ${0:2} machen). Für Details: RTFM, man bash, Abschnitt Parameter Expansion.
Fall 3: Es bleibt nur noch dein Fall eines Dateinamens ohne Pfad übrig. Ergänze diesen durch pwd zum vollständigen Pfad.
GNU bash, version 3.1.17(1)-release (i486-pc-linux-gnu)
Danke, aber hat sich ja durch den guten Beitrag von Rainer geklärt. Du rufst deine Skripte offenbar mit
sh skript
auf.
Wäre ich nie drauf gekommen. Aus lauter Faulheit sind mir diese zwei Zeichen schon zuviel, so daß ich immer die Shebang-Methode mit #!/bin/bash benutze.