Wypróbuj następujące proste jednolinijki:
Dla wszystkich systemów UNIX / OSX / Linux
dir=$(cd -P -- "$(dirname -- "$0")" && pwd -P)
Grzmotnąć
dir=$(cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)
Uwaga: Podwójny myślnik (-) jest używany w poleceniach do oznaczenia końca opcji poleceń, więc pliki zawierające myślniki lub inne znaki specjalne nie spowodują złamania polecenia.
Uwaga: w Bash użyj ${BASH_SOURCE[0]}
na korzyść $0
, w przeciwnym razie ścieżka może się złamać podczas jej pozyskiwania ( source
/ .
).
W przypadku systemu Linux, Mac i innych * BSD:
cd "$(dirname "$(realpath "$0")")";
Uwaga: realpath
powinien być domyślnie zainstalowany w najpopularniejszej dystrybucji Linuksa (np. Ubuntu), ale w niektórych może go brakować, więc musisz go zainstalować.
Uwaga: Jeśli używasz Bash, użyj ${BASH_SOURCE[0]}
na korzyść $0
, w przeciwnym razie ścieżka może się złamać podczas jej pozyskiwania ( source
/ .
).
W przeciwnym razie możesz spróbować czegoś takiego (użyje pierwszego istniejącego narzędzia):
cd "$(dirname "$(readlink -f "$0" || realpath "$0")")"
W przypadku systemu Linux:
cd "$(dirname "$(readlink -f "$0")")"
Używając linku do odczytu GNU na * BSD / Mac:
cd "$(dirname "$(greadlink -f "$0")")"
Uwaga: Musisz mieć coreutils
zainstalowany (np. 1. Zainstaluj Homebrew , 2. brew install coreutils
).
W bash
W bash możesz użyć do tego celu rozszerzeń parametrów , takich jak:
cd "${0%/*}"
ale to nie działa, jeśli skrypt jest uruchamiany z tego samego katalogu.
Alternatywnie możesz zdefiniować następującą funkcję w bash:
realpath () {
[[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}"
}
Ta funkcja przyjmuje 1 argument. Jeśli argument ma już ścieżkę bezwzględną, wypisz ją taką, jaka jest, w przeciwnym razie wypisz $PWD
argument zmienna + nazwa pliku (bez ./
prefiksu).
lub tutaj jest wersja zaczerpnięta z .bashrc
pliku Debian :
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"
}
Związane z:
Zobacz też:
Jak mogę uzyskać zachowanie readlink -f GNU na komputerze Mac?