Hinweis: Eine POSIX-kompatible Lösung finden Sie in dieser Antwort .
${BASH_SOURCE[0]}
(oder einfacher $BASH_SOURCE
[1]
) enthält den (möglicherweise relativen) Pfad des enthaltenen Skripts in allen Aufrufszenarien, insbesondere auch, wenn das Skript bezogen wird , was nicht zutrifft $0
.
Darüber hinaus kann Charles Duffy , wie Charles Duffy betont, vom Anrufer $0
auf einen beliebigen Wert gesetzt werden.
Auf der anderen Seite $BASH_SOURCE
kann leer sein, wenn keine benannte Datei beteiligt ist; z.B:
echo 'echo "[$BASH_SOURCE]"' | bash
Das folgende Beispiel veranschaulicht dies:
Skript foo
:
#!/bin/bash
echo "[$0] vs. [${BASH_SOURCE[0]}]"
$ bash ./foo
[./foo] vs. [./foo]
$ ./foo
[./foo] vs. [./foo]
$ . ./foo
[bash] vs. [./foo]
$0
ist Teil der POSIX-Shell-Spezifikation, während BASH_SOURCE
, wie der Name schon sagt, Bash-spezifisch ist.
[1] Optional lesen: ${BASH_SOURCE[0]}
gegen$BASH_SOURCE
:
Mit Bash können Sie das Element 0
einer Array- Variablen mithilfe der Skalarschreibweise referenzieren : Anstatt zu schreiben ${arr[0]}
, können Sie schreiben $arr
. Mit anderen Worten: Wenn Sie auf die Variable verweisen, als wäre sie ein Skalar , erhalten Sie das Element am Index 0
.
Die Verwendung dieser Funktion verdeckt die Tatsache, dass $arr
es sich um ein Array handelt, weshalb der beliebte Shell-Code linter shellcheck.net die folgende Warnung ausgibt (zum Zeitpunkt dieses Schreibens):
SC2128: Wenn Sie ein Array ohne Index erweitern, erhalten Sie nur das erste Element.
Nebenbei bemerkt: Diese Warnung ist zwar hilfreich, könnte aber präziser sein, da Sie nicht unbedingt das erste Element erhalten: Es wird speziell das Element am Index 0
zurückgegeben. Wenn also das erste Element einen höheren Index hat - welches ist in Bash möglich - Sie erhalten die leere Zeichenfolge; versuche es 'a[1]='hi'; echo "$a"'
.
(Im Gegensatz dazu zsh
, überhaupt der Renegat tatsächlich tut das erste Element zurück, unabhängig von dessen Index).
Sie können diese Funktion aufgrund ihrer Unklarheit meiden, sie funktioniert jedoch vorhersehbar, und pragmatisch gesehen müssen Sie selten, wenn überhaupt, auf andere Indizes als 0
Array-Variablen zugreifen ${BASH_SOURCE[@]}
.
BASH_SOURCE
wurde bei bash-3.0-alpha hinzugefügt. Abhängig von Ihrem Testregime haben Sie es möglicherweise nicht. Ich habe festgestellt, dass es sowohl unter Solaris als auch unter OS X fehlt. Siehe auch return: Kann nur von einer Funktion oder einem Sourcing-Skript unter U & L.SE "zurückkehren" .