Jak zweryfikować cel dowiązania symbolicznego wskazuje konkretną ścieżkę

16

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 $pathjest /some/where.

BillMan
źródło
2
Czy to znaczy związana przez konkretnej ścieżki? Czy nie możesz zrobić readlinkna znanej ścieżce i porównać ją ze ścieżką, którą testujesz?
Bratchley,
@Bratchley. Tak, o to mi chodziło ... dzięki za odpowiedź.
BillMan
2
Gorąco nalegam, abyś zawsze umieszczał zmienne powłoki w cudzysłowach (np. if [ -L "$path" ]), Chyba że masz dobry powód, aby tego nie robić i jesteś pewien, że wiesz, co robisz.
G-Man mówi „Przywróć Monikę”
@ G-Man dziękuje za wspaniałe opinie. Podświadomie wiem, że to robię, ale w praktyce o tym zapomnij .. wzmocnienie pomaga.
BillMan

Odpowiedzi:

22

Jeśli chcesz sprawdzić, czy $pathjest dowiązaniem symbolicznym, którego celem jest /some/where, możesz użyć readlinknarzędzia. To nie jest POSIX, ale jest dostępny na wielu systemach (GNU / Linux, BusyBox, * BSD,…).

if [ "$(readlink -- "$path")" = /some/where ]; then 

Pamiętaj, że jest to dokładne porównanie tekstu. Jeśli celem linku jest /some//wherelub jeśli jest wherei wartość $pathjest /some/link, to teksty nie będą pasować.

Wiele wersji readlinkobsł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 -efoperatora testwbudowanego 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.

if [ "$path" -ef "/some/where" ]; then 
Gilles „SO- przestań być zły”
źródło
pierwszy przykład nie działa, gdy link wskazuje ścieżkę względną ...
inemanja,
1
@inemanja Pewnie, że tak. Ale jak stwierdzam, jest to porównanie tekstu . Traktuje różne ścieżki do tego samego celu jako różne. Jeśli chcesz sprawdzić, czy celem dowiązania symbolicznego jest konkretny plik , a nie konkretna ścieżka , użyj jednej z metod opisanych poniżej.
Gilles „SO- przestań być zły”
0

Aby uniknąć problemów ze ścieżką względną i bezwzględną oraz „/” na końcu ścieżki lub łącza:

if [ "$(realpath $(readlink -- "$path"))" = $(realpath /some/where) ]; then
    echo "Is"
else 
    echo "Is not"
fi
inemanja
źródło
1
readlinknie wydaje się to konieczne, realpathautomatycznie rozpozna link symboliczny.
Dagang