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: realpathpowinien 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ć coreutilszainstalowany (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 $PWDargument zmienna + nazwa pliku (bez ./prefiksu).
lub tutaj jest wersja zaczerpnięta z .bashrcpliku 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?