readlink
jest standardem bash dla uzyskania absolutnej ścieżki. Ma również tę zaletę, że zwraca puste ciągi, jeśli ścieżki lub ścieżka nie istnieje (biorąc pod uwagę flagi).
Aby uzyskać bezwzględną ścieżkę do katalogu, który może istnieć, ale którego rodzice nie istnieją, użyj:
abspath=$(readlink -f $path)
Aby uzyskać bezwzględną ścieżkę do katalogu, który musi istnieć wraz ze wszystkimi rodzicami:
abspath=$(readlink -e $path)
Aby kanonizować podaną ścieżkę i podążać za dowiązaniami symbolicznymi, jeśli takowe istnieją, ale w przeciwnym razie zignoruj brakujące katalogi i po prostu zwróć ścieżkę, to:
abspath=$(readlink -m $path)
Jedynym minusem jest to, że readlink będzie podążał za linkami. Jeśli nie chcesz podążać za linkami, możesz skorzystać z tej alternatywnej konwencji:
abspath=$(cd ${path%/*} && echo $PWD/${path##*/})
Spowoduje to przejście do części katalogu $ path i wydrukowanie bieżącego katalogu wraz z częścią pliku $ path. Jeśli nie uda się zmienić chdir, otrzymasz pusty ciąg i błąd na stderr.
/foo/bar
czy/foo
istnieje, czy interesuje Cię tylko aspekt manipulacji ciągiem zgodnie z regułami nazw ścieżek?