Diese Lösung gilt nur für bash und nicht für tcsh. Beachten Sie, dass die häufig gelieferte Antwort ${BASH_SOURCE[0]}
nicht funktioniert, wenn Sie versuchen, den Pfad innerhalb einer Funktion zu finden.
Ich habe festgestellt, dass diese Zeile immer funktioniert, unabhängig davon, ob die Datei als Quelle oder als Skript ausgeführt wird.
echo ${BASH_SOURCE[${#BASH_SOURCE[@]} - 1]}
Wenn Sie Symlinks folgen möchten, verwenden Sie readlink
auf dem Pfad, den Sie oben erhalten, rekursiv oder nicht rekursiv.
Hier ist ein Skript, mit dem Sie es ausprobieren und mit anderen vorgeschlagenen Lösungen vergleichen können. Rufen Sie es als source test1/test2/test_script.sh
oder auf bash test1/test2/test_script.sh
.
#
# Location: test1/test2/test_script.sh
#
echo $0
echo $_
echo ${BASH_SOURCE}
echo ${BASH_SOURCE[${#BASH_SOURCE[@]} - 1]}
cur_file="${BASH_SOURCE[${#BASH_SOURCE[@]} - 1]}"
cur_dir="$(dirname "${cur_file}")"
source "${cur_dir}/func_def.sh"
function test_within_func_inside {
echo ${BASH_SOURCE}
echo ${BASH_SOURCE[${#BASH_SOURCE[@]} - 1]}
}
echo "Testing within function inside"
test_within_func_inside
echo "Testing within function outside"
test_within_func_outside
#
# Location: test1/test2/func_def.sh
#
function test_within_func_outside {
echo ${BASH_SOURCE}
echo ${BASH_SOURCE[${#BASH_SOURCE[@]} - 1]}
}
Der Grund, warum der Einzeiler funktioniert, wird durch die Verwendung der BASH_SOURCE
Umgebungsvariablen und ihrer assoziierten Elemente erklärt FUNCNAME
.
BASH_SOURCE
Eine Array-Variable, deren Mitglieder die Quelldateinamen sind, in denen die entsprechenden Shell-Funktionsnamen in der Array-Variablen FUNCNAME definiert sind. Die Shell-Funktion $ {FUNCNAME [$ i]} ist in der Datei $ {BASH_SOURCE [$ i]} definiert und wird von $ {BASH_SOURCE [$ i + 1]} aufgerufen.
FUNCNAME
Eine Array-Variable, die die Namen aller Shell-Funktionen enthält, die sich derzeit im Ausführungsaufrufstapel befinden. Das Element mit dem Index 0 ist der Name einer aktuell ausgeführten Shell-Funktion. Das unterste Element (das mit dem höchsten Index) ist "main". Diese Variable existiert nur, wenn eine Shell-Funktion ausgeführt wird. Zuweisungen zu FUNCNAME haben keine Auswirkung und geben einen Fehlerstatus zurück. Wenn FUNCNAME nicht gesetzt ist, verliert es seine besonderen Eigenschaften, auch wenn es später zurückgesetzt wird.
Diese Variable kann mit BASH_LINENO und BASH_SOURCE verwendet werden. Jedes Element von FUNCNAME verfügt über entsprechende Elemente in BASH_LINENO und BASH_SOURCE, um den Aufrufstapel zu beschreiben. Beispielsweise wurde $ {FUNCNAME [$ i]} aus der Datei $ {BASH_SOURCE [$ i + 1]} mit der Zeilennummer $ {BASH_LINENO [$ i]} aufgerufen. Der eingebaute Anrufer zeigt anhand dieser Informationen die aktuelle Anrufliste an.
[Quelle: Bash-Handbuch]