W skrypcie bash wiem, że mogę sprawdzić, czy plik jest dowiązaniem symbolicznym o następującej składni
if [ -L $path ]
Czy ktoś wie, jak bym przetestował, gdyby ta ścieżka była powiązana z określoną ścieżką? Np. Chcę sprawdzić, czy celem $path
jest /some/where
.
readlink
na znanej ścieżce i porównać ją ze ścieżką, którą testujesz?if [ -L "$path" ]
), Chyba że masz dobry powód, aby tego nie robić i jesteś pewien, że wiesz, co robisz.Odpowiedzi:
Jeśli chcesz sprawdzić, czy
$path
jest dowiązaniem symbolicznym, którego celem jest/some/where
, możesz użyćreadlink
narzędzia. To nie jest POSIX, ale jest dostępny na wielu systemach (GNU / Linux, BusyBox, * BSD,…).Pamiętaj, że jest to dokładne porównanie tekstu. Jeśli celem linku jest
/some//where
lub jeśli jestwhere
i wartość$path
jest/some/link
, to teksty nie będą pasować.Wiele wersji
readlink
obsługuje opcję-f
, która kanonizuje ścieżkę poprzez rozwinięcie wszystkich dowiązań symbolicznych.Wiele powłok, w tym dash, ksh, bash i zsh, obsługuje
-ef
operatoratest
wbudowanego w celu przetestowania, czy dwa pliki są takie same (twarde łącza do tego samego pliku, po następujących dowiązaniach symbolicznych). Ta funkcja jest również szeroko obsługiwana, ale nie POSIX.źródło
Aby uniknąć problemów ze ścieżką względną i bezwzględną oraz „/” na końcu ścieżki lub łącza:
źródło
readlink
nie wydaje się to konieczne,realpath
automatycznie rozpozna link symboliczny.