Jaka jest różnica między następującymi poleceniami?
mv foo bar
mv foo/ bar/
mv foo/ bar
mv foo bar/
Czy nie ma różnicy? Czy to zależy od użytej komendy? Pomyśl na przykład, że przeczytałem, że zachowanie rsync zmienia się nieco w zależności od używanej wersji. Czy ktoś ma dobre wytłumaczenie, więc nie muszę już zgadywać i czuć, że wiem, co robię?
Odpowiedzi:
Wiele narzędzi uniksowych traktuje dowiązania symboliczne w różny sposób w zależności od tego, czy występuje ukośnik końcowy.
To zachowanie jest opisane w dokumentacji POSIX Symbolic Link i jest również wspomniane w dokumentacji GNU coreutils .
Zasadniczo ukośnik końcowy oznacza śledzenie (lub „dereferencję”) dowiązania symbolicznego.
Na przykład w poniższym kodzie
dirlink
oznacza dowiązanie symboliczne, aledirlink/
oznacza katalog, do którego prowadzi dowiązanie symboliczne.rm
nie usunie katalogu, chyba że powieszrm -r
, alerm
bez opcji z przyjemnością usunie dowiązanie symboliczne.Jest także przydatny do przeglądania uprawnień do katalogu, bez konieczności zawracania sobie głowy tym, czy katalog jest prawdziwym katalogiem, czy tylko dowiązaniem symbolicznym do katalogu.
i nadal działa dla zwykłych katalogów:
Innym przykładem jest
find
polecenie. Jeślipath
poprosisz go o wyszukiwanie, jest to dowiązanie symboliczne, domyślnie nie podąży ono za dowiązaniem symbolicznym, co oznacza, że przetwarza tylko dowiązanie symboliczne. Dodanie ukośnika powoduje, że traktuje dowiązanie symboliczne jako katalog, do którego prowadzi dowiązanie.(niektóre wersje find mają opcję
-follow
lub-L
, ale dzięki temu podążają za wszystkimi dowiązaniami symbolicznymi, nie tylko pierwszymi)To
rsync
, czy powinieneś dodać ukośnik, zależy od tego, czy chcesz, aby katalog, który kopiujesz, był podkatalogiem, czy nie.Innymi słowy:
rsync dir dir.bak
kopiujedir
dodir.bak
, robiąc wdir
środkudir.bak
rsync dir/ dir.bak
kopiuje całą zawartośćdir
bez robienia wdir
środkudir.bak
źródło
Jak jsalonen już powiedział, polecenia te rzeczywiście mają identyczne wyniki, jeśli
foo
ibar
są, jak w rzeczywistości, katalogów.Jednakże, jeśli
foo
ibar
nie są katalogi, a następnie polecenie zakończy się niepowodzeniem, jeśli dołączyć ukośnik i uda, jeśli nie. Chodzi o to, że jeśli polecenie się powiedzie, prawdopodobnie nie uzyska oczekiwanego rezultatu. W rzeczywistości, można nawet stracić, jeśli danefoo
ibar
są pliki (bar
będzie nadpisane).Jeśli twoim zamiarem jest, aby określić, katalogów i plików nie, to należy użyć końcowy ukośnik, ponieważ to sprawia, że komenda bardziej wytrzymałe: jeśli oczekiwanie, że
foo
albobar
są katalogi nie powiedzie się, wówczas komenda nie powiedzie się z wdziękiem, zamiast nieoczekiwane rezultaty.Ponadto niektóre (rzadkie) polecenia zachowują się inaczej w zależności od obecności końcowego ukośnika, nawet w przypadku katalogów (jednym przykładem jest
rsync
).źródło