Es gibt eine Vielzahl von richtig Antworten hier, aber eine, die für mich nützlicher ist (um sicherzustellen, dass die relativen Pfade eines Skripts vorhersehbar bleiben/funktionieren), ist die Verwendung von pushd/popd:
pushd "$(dirname ${BASH_SOURCE:0})"
trap popd EXIT
# ./xyz, etc...
Dadurch wird das Verzeichnis der Quelldatei auf einen Navigationsstapel verschoben, wodurch das Arbeitsverzeichnis geändert wird, aber dann, wenn das Skript beendet wird (aus welchem Grund auch immer, einschließlich Fehlern), wird die trap
wird laufen popd
und stellt das aktuelle Arbeitsverzeichnis wieder her, bevor es ausgeführt wurde. Wenn das Skript cd
und dann fehlschlagen, könnte Ihr Terminal nach dem Ende der Ausführung in einem unvorhersehbaren Zustand sein - die Falle verhindert dies.