Wie kann ich den Namen der Bash-Skriptdatei im Skript selbst ermitteln?
Wenn mein Skript zum Beispiel in der Datei runme.sh
Wie kann ich dann dafür sorgen, dass die Meldung "Sie führen runme.sh aus" angezeigt wird, ohne dies fest zu kodieren?
Wie kann ich den Namen der Bash-Skriptdatei im Skript selbst ermitteln?
Wenn mein Skript zum Beispiel in der Datei runme.sh
Wie kann ich dann dafür sorgen, dass die Meldung "Sie führen runme.sh aus" angezeigt wird, ohne dies fest zu kodieren?
me=`basename "$0"`
Zum Einlesen eines Symlinks 1 was in der Regel nicht das ist, was Sie wollen (Sie wollen den Benutzer in der Regel nicht auf diese Weise verwirren), versuchen Sie es:
me="$(basename "$(test -L "$0" && readlink "$0" || echo "$0")")"
IMO wird das zu verwirrenden Ergebnissen führen. "Ich habe foo.sh ausgeführt, aber es sagt, ich führe bar.sh aus!? Das muss ein Fehler sein!" Außerdem ist einer der Zwecke von Symlinks mit unterschiedlichen Namen, dass sie je nach Namen unterschiedliche Funktionalität bieten (man denke an gzip und gunzip auf einigen Plattformen).
1 Das heißt, Symlinks so aufzulösen, dass der Benutzer beim Ausführen von foo.sh
was eigentlich ein Symlink zu bar.sh
möchten Sie den aufgelösten Namen verwenden bar.sh
statt foo.sh
.
$0 gibt Ihnen den Namen an, über den das Skript aufgerufen wurde, nicht den tatsächlichen Pfad der Skriptdatei.
Es funktioniert, es sei denn, Sie werden über einen Symlink aufgerufen. Aber selbst dann ist es normalerweise das, was Sie sowieso wollen, IME.
Sie können mit einem Namen aufgerufen werden, der gar nicht als Datei existiert -- das häufigste Beispiel ist der Aufruf von sh als "-/bin/sh", wodurch es als Login-Shell fungiert. Siehe exec -a
in Bash, oder execvp("/bin/foo", {"blah", ...})
.
\# ------------- SCRIPT ------------- #
`#!/bin/bash
echo
echo "# arguments called with ----> ${@} "
echo "# \$1 ----------------------> $1 "
echo "# \$2 ----------------------> $2 "
echo "# path to me ---------------> ${0} "
echo "# parent path --------------> ${0%/*} "
echo "# my name ------------------> ${0##*/} "
echo
exit`
# ------------- CALLED ------------- #
# Notice on the next line, the first argument is called within double,
# and single quotes, since it contains two words
**$ /misc/shell\_scripts/check\_root/show\_parms.sh "'hello there'" "'william'"**
# ------------- RESULTS ------------- #
# arguments called with ---> 'hello there' 'william'
# $1 ----------------------> 'hello there'
# $2 ----------------------> 'william'
# path to me --------------> /misc/shell\_scripts/check\_root/show\_parms.sh
# parent path -------------> /misc/shell\_scripts/check\_root
# my name -----------------> show\_parms.sh
# ------------- END ------------- #
Funktioniert nicht, wenn das Skript von einem anderen Ordner aus aufgerufen wird. Der Pfad ist in der Datei ${0##*/}
. Getestet mit GitBash.
Großartig! Das ist die Antwort, die sowohl für ./scrip.sh als auch für die Quelle ./script.sh funktioniert
Das ist es, was ich will, und es ist leicht zu bedienen" dirname $BASE_SOURCE
", um das Verzeichnis zu erhalten, in dem sich die Skripte befinden.
Ich habe diesen Unterschied fast auf die harte Tour gelernt, als ich ein selbstlöschendes Skript schrieb. Zum Glück wurde "rm" zu "rm -i" umbenannt :)
Diese Antwort ist IMHO die beste, weil die Lösung auf selbstdokumentierenden Code zurückgreift. $BASH_SOURCE ist völlig verständlich, ohne dass man irgendeine Dokumentation lesen muss, während z.B. ${0##*/} nicht verständlich ist.
Diese Antwort ist meiner Meinung nach von größerem Wert, denn wenn wir wie folgt vorgehen . <filename> [arguments]
, $0
würde den Namen der aufrufenden Shell angeben. Nun, zumindest auf OSX sicher.
Wenn der Skriptname Leerzeichen enthält, ist die Verwendung von "$0"
o "$(basename "$0")"
- oder unter MacOS: "$(basename \"$0\")"
. Dadurch wird verhindert, dass der Name verfälscht oder in irgendeiner Weise interpretiert wird. Im Allgemeinen ist es eine gute Praxis, Variablennamen in der Shell immer in Anführungszeichen zu setzen.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
3 Stimmen
Ähnlich [Kann ein Bash-Skript sagen, in welchem Verzeichnis es gespeichert ist?](zu stackoverflow.com/questions/59895/ )
1 Stimmen
Für das Verzeichnis, siehe: Abrufen des Quellverzeichnisses eines Bash-Skripts aus einer .