Shell Script Namen ausgeben

Hallo,

gibt es eine Möglichkeit, dass ein Shellscript seinen eigenen Namen (am besten mit Pfad) dynamisch ausliest?

Es geht darum, dass ich eine Schablone erstellen will, die immer folgenden Text als letzte Zeile einer Mail mit ausgibt:

Diese Mail wurde durch das Script /skripte/JaWieHeissIchDenNur.sh erstellt.

Vielen Dank für Eure Hilfe

Hallo 151kg,

gibt es eine Möglichkeit, dass ein Shellscript seinen eigenen
Namen (am besten mit Pfad) dynamisch ausliest?

Der name des Skripts steht in der Variablen $0
http://linuxseiten.kg-it.de/index.php?index=bash_Lek…

Viele Grüße
Marvin

Danke

Gibt es auch eine Variable für den Pfad?

Danke

Gibt es auch eine Variable für den Pfad?

So geht’s:

 case "$0" in
 /\* ) MyFullPathName="$0" ;;
 ./\* ) MyFullPathName="$PWD/${0#./}" ;;
 \*/\* ) MyFullPathName="$PWD/$0" ;;
 \* ) echo Whoopssss; exit 1 ;;
 esac

 MyDir=${MyFullPathName%/\*}
 MyName=${MyFullPathName##\*/}

 echo $MyFullPathName
 echo $MyDir
 echo $MyName

Quelle: http://diehn.net/blog/2008/10/can-a-bash-script-figu…

Hallo 151kg und Rainer,

So geht’s:

Eine Variante davon:

#!/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…

Viele Grüße
Marvin

Hallo,

leider hat $0 nur den reinen Scriptnamen drinnen, so dass ein „Auseinandernehmen“ nicht klappt.
Ist das Distriabhängig?

Hallo 151kg

leider hat $0 nur den reinen Scriptnamen drinnen, so dass ein
„Auseinandernehmen“ nicht klappt.
Ist das Distriabhängig?

Keine Ahnung. Wahrscheinlich aber eher Shell-abhängig? Bei mir in der GNU bash, version 3.2.39(1)-release war $0 immer mit Pfad.
Was benutzt Du denn?

Viele Grüße
Marvin

Danke, klappt super, aber wenn ich ehrlich bin, habe ich die Fallunterscheidung nicht so ganz verstanden, kannst Du dazu nochmal ne kurze Zeile schreiben?

Hallo,

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

Gruß
R.

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.

Gruß
Rainer

Super danke

GNU bash, version 3.1.17(1)-release (i486-pc-linux-gnu)

Hallo 151kg,

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.

Viele Grüße
Marvin