771 Stimmen

Wie erkenne ich den Namen der Skriptdatei in einem Bash-Skript?

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?

3 Stimmen

Ähnlich [Kann ein Bash-Skript sagen, in welchem Verzeichnis es gespeichert ist?](zu stackoverflow.com/questions/59895/ )

1 Stimmen

794voto

Tanktalus Punkte 20746
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 .

55 Stimmen

$0 gibt Ihnen den Namen an, über den das Skript aufgerufen wurde, nicht den tatsächlichen Pfad der Skriptdatei.

6 Stimmen

Es funktioniert, es sei denn, Sie werden über einen Symlink aufgerufen. Aber selbst dann ist es normalerweise das, was Sie sowieso wollen, IME.

0 Stimmen

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", ...}) .

315voto

Bill Hernandez Punkte 2859
\# ------------- 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 ------------- #

11 Stimmen

@NickC sehen Teilstring-Entfernung

1 Stimmen

Wie bekomme ich nur show_params d.h. der Name ohne optionale Erweiterung?

0 Stimmen

Funktioniert nicht, wenn das Skript von einem anderen Ordner aus aufgerufen wird. Der Pfad ist in der Datei ${0##*/} . Getestet mit GitBash.

229voto

Dimitre Radoulov Punkte 25874

Con bash >= 3 die folgenden Werke:

$ ./s
0 is: ./s
BASH_SOURCE is: ./s
$ . ./s
0 is: bash
BASH_SOURCE is: ./s

$ cat s
#!/bin/bash

printf '$0 is: %s\n$BASH_SOURCE is: %s\n' "$0" "$BASH_SOURCE"

25 Stimmen

Großartig! Das ist die Antwort, die sowohl für ./scrip.sh als auch für die Quelle ./script.sh funktioniert

7 Stimmen

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.

2 Stimmen

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 :)

129voto

Zainka Punkte 1079

$BASH_SOURCE gibt die richtige Antwort, wenn das Skript beschafft wird.

Dies schließt jedoch den Pfad ein. Um nur den Dateinamen des Skripts zu erhalten, verwenden Sie:

$(basename $BASH_SOURCE)

7 Stimmen

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.

1 Stimmen

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.

5 Stimmen

@AndreasM.Oberheim der Nachteil von basename ist, dass ein separater Prozess geforkt werden muss, während ##*/ ist nur die eigene Verarbeitung der Bash. Sie können immer noch $BASH_SOURCE aber damit: ${BASH_SOURCE[0]##*/}

72voto

Josh Lee Punkte 159535

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.

3 Stimmen

+1 für direkte Antwort + prägnant. Wenn Sie Symlink-Funktionen benötigen, schlage ich vor, nachzusehen: Travis B. Hartwells Antwort.

CodeJaeger.com

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.

Powered by:

X