Lepiej późno niż wcale. Byłem zmotywowany do opracowania tego specjalnie, ponieważ moje skrypty Fedory nie działały na komputerze Mac. Problemem są zależności i Bash. Komputery Mac nie mają ich, a jeśli tak, to często znajdują się gdzie indziej (inna ścieżka). Manipulowanie ścieżkami zależności w wieloplatformowym skrypcie Bash to w najlepszym wypadku ból głowy, aw najgorszym przypadku zagrożenie bezpieczeństwa - najlepiej, jeśli to możliwe, unikać ich używania.
Poniższa funkcja get_realpath () jest prosta, skoncentrowana na Bash i nie są wymagane żadne zależności. Korzystam tylko z echa i płyty CD wbudowanych w Bash . Jest również dość bezpieczny, ponieważ wszystko jest testowane na każdym etapie i zwraca warunki błędu.
Jeśli nie chcesz podążać za dowiązaniami symbolicznymi, umieść zestaw -P na początku skryptu, ale w przeciwnym razie cd powinien domyślnie rozpoznać dowiązania symboliczne. Został przetestowany z argumentami pliku, które są {absolutne | krewny | dowiązanie symboliczne | local} i zwraca bezwzględną ścieżkę do pliku. Do tej pory nie mieliśmy z tym żadnych problemów.
function get_realpath() {
if [[ -f "$1" ]]
then
# file *must* exist
if cd "$(echo "${1%/*}")" &>/dev/null
then
# file *may* not be local
# exception is ./file.ext
# try 'cd .; cd -;' *works!*
local tmppwd="$PWD"
cd - &>/dev/null
else
# file *must* be local
local tmppwd="$PWD"
fi
else
# file *cannot* exist
return 1 # failure
fi
# reassemble realpath
echo "$tmppwd"/"${1##*/}"
return 0 # success
}
Możesz to połączyć z innymi funkcjami nazwa_katalogu get, nazwa_pliku get, nazwa_pliku get i nazwa_ścieżki. Można je znaleźć w naszym repozytorium GitHub jako realpath-lib (pełne ujawnienie - to nasz produkt, ale oferujemy go społeczności bez żadnych ograniczeń). Może również służyć jako narzędzie instruktażowe - jest dobrze udokumentowane.
Staraliśmy się jak najlepiej stosować tak zwane „nowoczesne Bash”, ale Bash to duży temat i jestem pewien, że zawsze będzie miejsce na poprawę. Wymaga Bash 4+, ale może być przystosowany do pracy ze starszymi wersjami, jeśli nadal istnieją.
readlink
może to być polecenie wbudowane lub polecenie zewnętrzne.