Probieren Sie die folgenden einfachen Einzeiler aus:
Für alle UNIX / OSX / Linux
dir=$(cd -P -- "$(dirname -- "$0")" && pwd -P)
Bash
dir=$(cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)
Hinweis: Ein doppelter Bindestrich (-) wird in Befehlen verwendet, um das Ende der Befehlsoptionen anzuzeigen, sodass Dateien mit Bindestrichen oder anderen Sonderzeichen den Befehl nicht beschädigen.
Hinweis: Verwenden Sie ${BASH_SOURCE[0]}
in Bash zugunsten von $0
, da sonst der Pfad bei der Beschaffung unterbrochen werden kann ( source
/ .
).
Für Linux, Mac und andere * BSD:
cd "$(dirname "$(realpath "$0")")";
Hinweis: realpath
Sollte standardmäßig in der beliebtesten Linux-Distribution (wie Ubuntu) installiert sein, in einigen Fällen kann es jedoch fehlen, sodass Sie es installieren müssen.
Hinweis: Wenn Sie Bash verwenden, verwenden Sie ${BASH_SOURCE[0]}
zugunsten von $0
, da sonst der Pfad bei der Beschaffung unterbrochen werden kann ( source
/ .
).
Andernfalls können Sie so etwas ausprobieren (es wird das erste vorhandene Tool verwendet):
cd "$(dirname "$(readlink -f "$0" || realpath "$0")")"
Für Linux spezifisch:
cd "$(dirname "$(readlink -f "$0")")"
Verwenden des GNU-Readlinks auf * BSD / Mac:
cd "$(dirname "$(greadlink -f "$0")")"
Hinweis: Sie müssen coreutils
installiert haben (z. B. 1. Homebrew installieren , 2. brew install coreutils
).
In Bash
In bash können Sie Parametererweiterungen verwenden , um dies zu erreichen, wie zum Beispiel:
cd "${0%/*}"
Es funktioniert jedoch nicht, wenn das Skript aus demselben Verzeichnis ausgeführt wird.
Alternativ können Sie die folgende Funktion in bash definieren:
realpath () {
[[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}"
}
Diese Funktion benötigt 1 Argument. Wenn das Argument bereits einen absoluten Pfad hat, drucken Sie es so wie es ist, andernfalls drucken Sie das $PWD
Argument Variable + Dateiname (ohne ./
Präfix).
oder hier ist die Version aus der Debian- .bashrc
Datei:
function realpath()
{
f=$@
if [ -d "$f" ]; then
base=""
dir="$f"
else
base="/$(basename "$f")"
dir=$(dirname "$f")
fi
dir=$(cd "$dir" && /bin/pwd)
echo "$dir$base"
}
Verbunden:
Siehe auch:
Wie kann ich das Verhalten von GNUs readlink -f auf einem Mac ermitteln?