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: realpathSollte 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 coreutilsinstalliert 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 $PWDArgument Variable + Dateiname (ohne ./Präfix).
oder hier ist die Version aus der Debian- .bashrcDatei:
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?