@ slm ♦ Odpowiedzi odpowiadają na to pytanie, ale to pytanie jest inne, mówi: „Zakładając, że wiesz, że cel jest dowiązaniem symbolicznym, a nie plikiem”.
Stéphane Gourichon
Nie wygląda na to, że zaakceptowałeś tutaj odpowiedź @IQAndreas. Zrób to, jeśli ci pomogli.
Gray
Odpowiedzi:
56
Za każdym razem, gdy masz tego typu pytania, najlepiej zaplanować mały test, aby zobaczyć, co się właściwie dzieje. Do tego możesz użyć strace.
System wywołuje unlink()i unlinkat()jest zasadniczo taki sam, z wyjątkiem różnic opisanych na tej stronie podręcznika: http://linux.die.net/man/2/unlinkat .
fragment
Wywołanie systemowe unlinkat () działa dokładnie tak samo jak unlink (2) lub rmdir (2) (w zależności od tego, czy flagi zawierają flagę AT_REMOVEDIR), z wyjątkiem różnic opisanych na tej stronie podręcznika.
Jeśli nazwa ścieżki podana w nazwie ścieżki jest względna, to jest interpretowana w odniesieniu do katalogu, do którego odwołuje się deskryptor pliku dirfd (a nie względem bieżącego katalogu roboczego procesu wywołującego, jak to robi unlink (2) i rmdir (2) ) dla względnej nazwy ścieżki).
Jeśli nazwa ścieżki podana w pathname jest względna, a dirfd jest wartością specjalną AT_FDCWD, wówczas ścieżka jest interpretowana w odniesieniu do bieżącego katalogu roboczego procesu wywołującego (jak unlink (2) i rmdir (2)).
Jeśli nazwa ścieżki podana w pathname jest bezwzględna, to dirfd jest ignorowane.
Ponieważ daje AT_FDCWD, nie ma różnicy między unlinki unlinkat.
Barmar
6
Z przyjemnością czytam tę odpowiedź, ponieważ po prostu „nauczyłem się łowić” w potężny, elastyczny sposób, kiedy często dostaję rybę lub czasami „uczę się łowić” w prosty sposób na SO :-)
mędrzec
21
POSIX określa, że unlinknarzędzie wywołuje funkcję biblioteki C unlinki nic więcej. Nie ma żadnej opcji. Jeśli przekażesz prawidłową nazwę ścieżki do czegoś, co nie jest katalogiem, i jeśli masz uprawnienia do zapisu w katalogu, w którym ten obiekt się znajduje, unlinkusuniesz ją.
rmto tradycyjne polecenie uniksowe, które ma trochę innych funkcji i nie jest całkiem nadzbiorem unlink(patrz poniżej).
Po pierwsze, rmprzeprowadza kontrole bezpieczeństwa. Jeśli spróbujesz rmuzyskać obiekt, do którego nie masz uprawnień do zapisu (które są nieistotne dla twojej możliwości usunięcia: bezpośrednie uprawnienia są!), rmJednak odmawia, chyba że -fokreślono inaczej . rmzwykle narzeka, jeśli plik nie istnieje, podobnie jak unlink; jednak ze -f, rmnie narzeka. Jest to często wykorzystywane w Makefiles ( clean: @rm -f $(OBJS) ...), więc make cleannie zawiedzie się, gdy nie będzie nic do usunięcia.
Po drugie, rmma -iopcję interaktywnego potwierdzania usunięcia.
Po trzecie, rmma -rdo rekursywnie usuwanie katalogu, który jest czymś, co unlinknie jest konieczne do zrobienia, ponieważ funkcja biblioteki C nie robi.
unlinkNarzędzie nie jest dokładnie okrojoną rm. Wykonuje podzbiór co rmrobi, ale ma semantykę, która jest połączeniem rmz-f i rm bez-f .
Załóżmy, że chcesz po prostu usunąć zwykły plik, niezależnie od jego uprawnień. Ponadto załóżmy, że chcesz, aby polecenie zakończyło się niepowodzeniem, jeśli plik nie istnieje lub z jakiegokolwiek innego powodu. Ani rm filenie rm -f filespełnia wymagań. rm fileodrzuci, jeśli pliku nie można zapisać. Ale rm -f filezignoruje reklamację, jeśli brakuje pliku. unlink filewykonuje pracę.
unlinkprawdopodobnie został wprowadzony, ponieważ rmjest zbyt sprytny: czasami po prostu chcesz czystej unlinksemantyki uniksowej : „Proszę, odejdź od tego wpisu katalogu, jeśli pozwalają na to uprawnienia katalogu” .
Oto najjaśniejsza odpowiedź tutaj. To rzeczywiście daje przypadek użycia dla unlinkzamiast różnic prostu opisujących.
Wildcard
19
Za pomocą jednego pliku, rm i unlink wykonują to samo zadanie, usuń plik. Zgodnie z definicją POSIX rmi unlinkoba wywołują wywołanie systemowe unlink () .
W GNU rmwywołuje funkcję systemową unlinkat () , która jest równoważna funkcji unlink()lub rmdir (), z wyjątkiem przypadku, gdy ścieżka określa ścieżkę względną.
Uwaga
W niektórych systemach unlinkmożna również usunąć katalog. Przynajmniej w systemie GNU unlinknigdy nie można usunąć nazwy katalogu.
Odpowiedzi:
Za każdym razem, gdy masz tego typu pytania, najlepiej zaplanować mały test, aby zobaczyć, co się właściwie dzieje. Do tego możesz użyć
strace
.odczepić
rm
Gdy spojrzysz na 2 wynikowe pliki dziennika, możesz „zobaczyć”, co faktycznie robi każde połączenie.
Awaria
Po
unlink
wywołaniu wywołaniaunlink()
systemowego:Ze
rm
jest to nieco inna droga:System wywołuje
fragmentunlink()
iunlinkat()
jest zasadniczo taki sam, z wyjątkiem różnic opisanych na tej stronie podręcznika: http://linux.die.net/man/2/unlinkat .źródło
AT_FDCWD
, nie ma różnicy międzyunlink
iunlinkat
.POSIX określa, że
unlink
narzędzie wywołuje funkcję biblioteki Cunlink
i nic więcej. Nie ma żadnej opcji. Jeśli przekażesz prawidłową nazwę ścieżki do czegoś, co nie jest katalogiem, i jeśli masz uprawnienia do zapisu w katalogu, w którym ten obiekt się znajduje,unlink
usuniesz ją.rm
to tradycyjne polecenie uniksowe, które ma trochę innych funkcji i nie jest całkiem nadzbioremunlink
(patrz poniżej).Po pierwsze,
rm
przeprowadza kontrole bezpieczeństwa. Jeśli spróbujeszrm
uzyskać obiekt, do którego nie masz uprawnień do zapisu (które są nieistotne dla twojej możliwości usunięcia: bezpośrednie uprawnienia są!),rm
Jednak odmawia, chyba że-f
określono inaczej .rm
zwykle narzeka, jeśli plik nie istnieje, podobnie jakunlink
; jednak ze-f
,rm
nie narzeka. Jest to często wykorzystywane w Makefiles (clean: @rm -f $(OBJS) ...
), więcmake clean
nie zawiedzie się, gdy nie będzie nic do usunięcia.Po drugie,
rm
ma-i
opcję interaktywnego potwierdzania usunięcia.Po trzecie,
rm
ma-r
do rekursywnie usuwanie katalogu, który jest czymś, counlink
nie jest konieczne do zrobienia, ponieważ funkcja biblioteki C nie robi.unlink
Narzędzie nie jest dokładnie okrojonąrm
. Wykonuje podzbiór corm
robi, ale ma semantykę, która jest połączeniemrm
z-f
i rm bez-f
.Załóżmy, że chcesz po prostu usunąć zwykły plik, niezależnie od jego uprawnień. Ponadto załóżmy, że chcesz, aby polecenie zakończyło się niepowodzeniem, jeśli plik nie istnieje lub z jakiegokolwiek innego powodu. Ani
rm file
nierm -f file
spełnia wymagań.rm file
odrzuci, jeśli pliku nie można zapisać. Alerm -f file
zignoruje reklamację, jeśli brakuje pliku.unlink file
wykonuje pracę.unlink
prawdopodobnie został wprowadzony, ponieważrm
jest zbyt sprytny: czasami po prostu chcesz czystejunlink
semantyki uniksowej : „Proszę, odejdź od tego wpisu katalogu, jeśli pozwalają na to uprawnienia katalogu” .źródło
unlink
zamiast różnic prostu opisujących.Za pomocą jednego pliku, rm i unlink wykonują to samo zadanie, usuń plik. Zgodnie z definicją POSIX
rm
iunlink
oba wywołują wywołanie systemowe unlink () .W GNU
rm
wywołuje funkcję systemową unlinkat () , która jest równoważna funkcjiunlink()
lub rmdir (), z wyjątkiem przypadku, gdy ścieżka określa ścieżkę względną.Uwaga
W niektórych systemach
unlink
można również usunąć katalog. Przynajmniej w systemie GNUunlink
nigdy nie można usunąć nazwy katalogu.źródło