Es gibt keinen 100% portablen und zuverlässigen Weg, um einen Pfad zu einem aktuellen Skriptverzeichnis abzufragen. Insbesondere zwischen verschiedenen Backends wie Cygwin , MinGW , MSYS Linux, etc. Dieses Problem wurde in der Bash seit Ewigkeiten nicht richtig und vollständig gelöst.
Dies könnte zum Beispiel nicht gelöst werden, wenn Sie den Pfad nach der source
Befehl, um ein anderes Bash-Skript einzubinden, das seinerseits denselben source
um ein anderes Bash-Skript einzubinden und so weiter.
Im Falle der source
zu verwenden, schlage ich vor, den Befehl source
Befehl mit etwas wie diesem:
function include()
{
if [[ -n "$CURRENT_SCRIPT_DIR" ]]; then
local dir_path=... get directory from `CURRENT_SCRIPT_DIR/$1`, depends if $1 is absolute path or relative ...
local include_file_path=...
else
local dir_path=... request the directory from the "$1" argument using one of answered here methods...
local include_file_path=...
fi
... push $CURRENT_SCRIPT_DIR in to stack ...
export CURRENT_SCRIPT_DIR=... export current script directory using $dir_path ...
source "$include_file_path"
... pop $CURRENT_SCRIPT_DIR from stack ...
}
Von nun an wird die Verwendung von include(...)
stützt sich auf frühere CURRENT_SCRIPT_DIR
in Ihrem Skript.
Dies funktioniert nur, wenn Sie alle source
Befehle von include
Befehl. Wenn Sie das nicht können, dann haben Sie keine Wahl. Zumindest solange, bis die Entwickler des Bash-Interpreters einen expliziten Befehl zur Abfrage des aktuellen Skriptverzeichnisses bereitstellen.
Meine eigene Umsetzung kommt dem am nächsten: https://sourceforge.net/p/tacklelib/tacklelib/HEAD/tree/trunk/bash/tacklelib/bash_tacklelib
https://github.com/andry81/tacklelib/tree/trunk/bash/tacklelib/bash_tacklelib
(Suche nach dem tkl_include
Funktion)
91 Stimmen
Keine der derzeitigen Lösungen funktioniert, wenn es irgendwelche Zeilenumbrüche am Ende des Verzeichnisnamens - Sie werden von der Befehlssubstitution entfernt. Um dies zu umgehen, können Sie ein Nicht-Neuzeilen-Zeichen innerhalb der Befehlsersetzung anhängen -
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd && echo x)"
- und entfernen Sie es ohne Befehlssubstitution -DIR="${DIR%x}"
.94 Stimmen
@jpmc26 Es gibt zwei sehr häufige Situationen: Unfälle und Sabotage. Ein Skript sollte nicht auf unvorhersehbare Weise versagen, nur weil jemand, irgendwo, eine
mkdir $'\n'
.36 Stimmen
Wer Leute sein System auf diese Weise sabotieren lässt, sollte es nicht der Bash überlassen, solche Probleme zu erkennen... und schon gar nicht Leute einstellen, die zu solchen Fehlern fähig sind. Ich habe in den 25 Jahren, in denen ich die Bash benutze, noch nie erlebt, dass so etwas irgendwo passiert.... Deshalb gibt es Dinge wie Perl und Praktiken wie Taint Checking (ich werde wahrscheinlich dafür geflamed werden, dass ich das sage :)
79 Stimmen
Ich empfehle Ihnen, dies zu lesen Bash FAQ über das Thema.
0 Stimmen
"${PWD%/}/application"