Próbuję sprawdzić, czy dowiązanie symboliczne istnieje w bash. Oto, co próbowałem.
mda=/usr/mda
if [ ! -L $mda ]; then
echo "=> File doesn't exist"
fi
mda='/usr/mda'
if [ ! -L $mda ]; then
echo "=> File doesn't exist"
fi
To jednak nie działa. Jeśli '!' jest pominięty, nigdy się nie uruchamia. I jeśli '!' jest tam, uruchamia się za każdym razem.
Odpowiedzi:
-L
zwraca wartość true, jeśli „plik” istnieje i jest dowiązaniem symbolicznym (połączony plik może, ale nie musi istnieć). Chcesz-f
(zwraca true, jeśli plik istnieje i jest zwykłym plikiem), a może po prostu-e
(zwraca true, jeśli plik istnieje bez względu na typ).Według podręcznika GNU ,
-h
jest identyczny-L
, ale według podręcznika BSD , nie należy stosować:źródło
!
jestif ! [ -L $mda ]; then .... fi
np. Umieszczenie wykrzyknika poza nawiasami kwadratowymi.if [ ! -L "$mda" ]; then ... fi
(uwaga:if [ ! ... ]
iif ! [ ... ]
są identyczne :)-L
i-h
są takie same .man test
również to potwierdza.-L oznacza, że istnieje test dla pliku i jest on również dowiązaniem symbolicznym
Jeśli nie chcesz testować, czy plik jest dowiązaniem symbolicznym, ale po prostu sprawdź, czy istnieje niezależnie od typu (plik, katalog, gniazdo itp.), Użyj -e
Więc jeśli plik jest naprawdę plikiem, a nie tylko dowiązaniem symbolicznym, możesz wykonać wszystkie te testy i uzyskać status wyjścia, którego wartość wskazuje na błąd.
źródło
-e "${file}"
kończy się niepowodzeniem, jeśli dowiązanie symboliczne istnieje, ale jego cel nie istnieje.Możesz sprawdzić istnienie dowiązania symbolicznego i czy nie jest zerwane z:
Kompletne rozwiązanie to:
źródło
Może tego właśnie szukasz. Aby sprawdzić, czy plik istnieje i nie jest łączem.
Wypróbuj to polecenie:
źródło
Co powiesz na używanie
readlink
?źródło
Czy plik naprawdę jest dowiązaniem symbolicznym? Jeśli nie, zwykłym testem na istnienie jest
-r
lub-e
.Zobaczyć
man test
.źródło
Jeśli testujesz istnienie pliku, chcesz, aby nie -e -L. -L testy dla dowiązania symbolicznego.
źródło
najpierw możesz zrobić z tym stylem:
jeśli chcesz to zrobić w bardziej zaawansowanym stylu, możesz napisać to tak:
wynik powyżej jest następujący:
źródło