Od lat ln
piszę dowiązania symboliczne, ale wciąż nie rozumiem kolejności parametrów.
Zwykle piszę:
ln -s a b
a następnie patrząc na wyniki, aby sobie przypomnieć.
Zawsze wyobrażam sobie, że będę a -> b
tak, jak to czytam, kiedy faktycznie jest odwrotnie b -> a
. Jest to sprzeczne z intuicją, więc uważam, że zawsze się zastanawiam.
Czy ktoś ma jakieś wskazówki, które pomogą mi zapamiętać prawidłową kolejność?
a
i nazwij tob
”ln source target
. Tak samo jakcp source target
,mv source target
; ...Odpowiedzi:
Używam następujących:
ln
ma formę jednoparametrową (druga forma wymieniona na stronie podręcznika ), w której wymagany jest tylko cel (ponieważ jakln
w ogóle może działać bez znajomości celu) iln
tworzy łącze w bieżącym katalogu. Forma dwuargumentowa jest dodatkiem do formy jednargumentowej, dlatego cel jest zawsze pierwszym argumentem.źródło
ln
.-t
), wydaje się niemal dowodem. msgstr "ln
tworzy link w bieżącym katalogu. Forma dwuargumentowa jest dodatkiem do formy jednoargumentowej i dlatego cel jest zawsze pierwszym argumentem". Ponieważ ma to sens, że tak byłoby w przypadku drugiej formy, myślę, że pomoże mi to zapamiętać.Mówię „
ln
jest jakcp
.„ Źródło ”musi być na pierwszym miejscu”.źródło
mv
.mv
,cp
iln
wszystkie traktują istniejący plik jako pierwszy argument, a docelową nazwę pliku docelowego lub katalogu jako drugi argument.memcpy
,strcpy
itd. Działają na odwrót.memcpy(dest,src,n);
map bardzo dobrzedest = src;
. Innymi słowy, ustaw (pierwszen
bajty) dest równe (pierwszen
bajty) src.Większość Uniksów dokumentuje
ln
polecenie jako(Pomijam tutaj opcje itp.)
Przykłady:
Standard POSIX
OpenBSD :
NetBSD i FreeBSD
System operacyjny Mac
Solaris
AIX
Podręcznik GNU
ln
wywołujesource
cel i nazwętarget
linku .Podręcznik GNU dla
ln
Ignorując wybór słów GNU,
ln
narzędzie stosuje taką samą semantykę jak np.mv
Icp
tym, że celem jest to, co jest tworzone ze źródła .W związku z tym,
utworzy dowiązanie symboliczne
b
wskazujące naa
.Zauważ też, że podczas tworzenia dowiązań symbolicznych źródłem jest po prostu ciąg znaków reprezentujący to, na co powinno wskazywać dowiązanie symboliczne. Zazwyczaj nie sprawdza się, czy wskazuje na coś przydatnego:
źródło
ln -s a b
działa, a to nie ma nic wspólnego ze sformułowaniami GNU, ponieważ nie sądzę, żebym kiedykolwiek widział frazę na stronie podręcznika użytkownika. : D (Łatwiej jest po prostu uruchomić,ln -si a b
gdy nie jestem pewien, narzeka, jeślib
już istnieje.)Gdyby to pomogło komukolwiek: przyzwyczaiłem się myśleć o tym jako „ln what where ”, co pomaga mi pamiętać, że pierwszy argument („what”) to istniejący plik, drugi („where”) to miejsce umieścić (link do) go. W przeciwieństwie do rozumowania w większości innych odpowiedzi, jest to nic innego, jak tylko zwięzłe zdanie, które mogę sobie w myślach recytować, pisząc polecenie, które służy jako pamięć. Prawdopodobnie nie będzie to przydatne dla wszystkich, ale podejrzewam, że pomoże niektórym ludziom.
Pomaga to, że inne standardowe komendy manipulacji plikami używają tej samej konwencji, więc mogę zrobić to samo dla
cp
imv
.źródło
Niedawno usłyszałem świetny sposób na zapamiętanie tej konkretnej rzeczy: rymu
Pierwszym wierszem są argumenty ln: coś starego, po którym następuje nazwa nowego wpisu katalogu.
źródło
Od podręczników Unix First Edition 1971 .
Istnieje druga prosta forma składni.
edit: I umieścić plik lub FILENAME zamiast TARGET --- zobaczyć komentarze itd. patrz również bardzo długi dodatek na dole, zwracając się do góry lodowej, twarde i miękkie z
ln
, a nie tylko czubek niego.GNU
ln
ma to:gdzie nie potrzebujesz nazwy linku. Po
ln -s /usr/lib/modules
otrzymaniuo tej samej nazwie co FILENAME („target” lub „source”), dokładnie tam, gdzie jesteś. Bez wyboru, bez zamieszania.
Teraz, jeśli jesteś bardziej wymagający i chcesz utworzyć link pod inną nazwą i / lub gdzieś indziej , dodaj to życzenie jako nazwę lub ścieżkę. Prawdziwy cel jest na pierwszym miejscu, a druga fantastyczna nazwa nowego linku.
Albo mówisz: „Znam ten zapis strzałki
ls -l
dla linków. Nie mam strzałki w powłoce, która wskazywałaby kierunek mojego linku. Więc muszę go odwrócić”.Tworzysz go w jednym kierunku, dzięki czemu możesz go używać w drugim.
(ZAKOŃCZENIE CZĘŚCI ODPOWIEDZI NA PYTANIE)
Na innym poziomie samo słowo „link” ma głęboko ukryte podwójne znaczenie. Powiązania symboliczne pojawiły się później, więc na początku link był tylko linkiem. Nie było miękkiego i twardego, żadnej
-s
opcji. A teraz używam nawet symboliki target-źródło:Na tym etapie istnieją linki, ale nie ma twardych i miękkich i
ls -l
nie pokazuje strzałek, ponieważ nie ma kierunku w (twardym) łączu. „Link” na tym etapie ewolucji unixa oznaczał, że nazwa pliku „B” (pozycja katalogu „B”) w systemie plików wskazuje ten sam i-węzeł, na który wskazuje nazwa pliku „A”.Pliki A i B są „połączone” razem, ponieważ dzielą te same bloki. Więc teraz przy każdym rm jądro musi sprawdzać: czy usuwam / zwalniam bloki tego pliku na dysku, czy też jest inny plik powiązany z tymi samymi blokami? W tym celu wykorzystywany jest licznik linków.
Powiedz, że chcesz zachować duży plik na / tmp grom, który chcesz usunąć
ln /tmp/bigfile
. Teraz masz duży plik bigfile w swoim reż. Po wyczyszczeniu / tmp i przeniesieniu „oryginału” z przyjemnością korzystasz z tych samych bloków danych. Nie dostajesz martwego lub wiszącego linku, masz normalny plik. Wskazuje brak pliku, a tylko bloki systemu plików, jak robi to każdy wpis katalogu. Dopiero teraz „czyszczenie” / tmp nie jest tak skuteczne jak wcześniej. Wygląda na pustą i jest, ale bloki na partycji nie zwalniają się.Chociaż twardy link nie kosztuje samego miejsca, jak cp, pośrednio może to zrobić.
Dodanie
ln -s
do powyższej sekwencji:Teraz „B”, miękkie łącze, ma tylko ciąg znaków z nazwą ścieżki. To są „miękkie” informacje. Technicznie „A” i „B” nie są ze sobą powiązane. Ale nadal B jest „linkiem” w nowym sensie, że można użyć zapisanej nazwy ścieżki jako skrótu do „A”. Teraz jest to „link do A” (kropka), a nie „ link do i -węzła pliku A”
Oba rodzaje linków mogą mylić nie tylko ludzi, ale także jądro / fs. Strona podręcznika użytkownika z 1971 r. Zauważa: „BŁĘDY: linki są dwukrotnie archiwizowane i odtwarzane jako osobne pliki z osobnymi i-węzłami”.
Twarde linki do katalogów (rzadkie / niedozwolone) mogą łatwo doprowadzić do zatkania.
Miękkie linki do katalogów (bardzo często) mogą prowadzić do wiecznych pętli - musi to być rozpoznane przez narzędzia / jądro.
Praktyczny przykład w bash
Począwszy od zwykłego pliku „F” ...
... sprawia, że Fhard ma taki sam rozmiar jak F, ale ZARÓWNO pojawiają się teraz w kolorze ciemnoczerwonym BEZ strzałek w
ls -l --color
. Ze względu nastat
wyświetlanie „Links: 2” w połączeniu z „Inode: xyz”. Twarde linkowanie F powoduje, że sam F staje się twardym linkem. Oba są / pozostaną typem pliku „zwykły plik”. Ale oba mają i-węzeł z liczbą linków powyżej 1.... tworzy mały „nieregularny” plik „Fsoft” z typem pliku „dowiązanie symboliczne” - nawet więcej miejsca niż pusty reż. A
ls -l
nie pokazuje nic specjalnego dla „F”. W przypadku Fsoft wyświetlany rozmiar to 1 bajt, ponieważ ciąg znaków to „F” iFsoft -> F
jest wyświetlany jako nazwa. Nie trzeba pokolorować miękkiego linku, aby go rozpoznać. Ponieważ w krótkiej formie dołączanyls -F
jest zwinięty łańcuch@
:Fsoft@
Z
ls -l
wygląda to tak:Fhard ma rozmiar i typ F.
Fsoft ma nazwę F i długość nazwy F jako rozmiar i inny typ pliku.
Krótkie
ls -sF
:dodanie
--block-size=1
nie daje również takich samych rozmiarów. Fsoft ma rozmiar „jeden bajt, zero bloków”. F i Fhard odchylają równolegle:Aby sprawdzić, czy Fsoft zwisa, czy nie,
ls
możesz użyć kolorów.źródło
Naprawdę warto pamiętać, że nazwa linku jest opcjonalna. Jeśli nie jest podany, używana jest basename obiektu docelowego łącza.
jest identyczny z całkowitym usunięciem nazwy linku:
Nie miałoby to sensu, gdyby cel linku był wymieniony jako ostatni.
źródło
Wystarczy pomyśleć o Unixie -> AT&T -> miejscu docelowym po prawej:
źródło
ln abc def
,abc
idef
są tym samym obiektem; są nierozróżnialne. Co więcej, operacja nie ma wpływuabc
, poza zwiększeniem liczby linków. Miejsce docelowe todef
. Wskaźnik do obiektu jest nowo zainstalowany wdef
lokalizacji.ln -s abc def
oznacza to, że treśćabc
jest zapisywana w lokalizacjidef
.abc
nawet nie musi na nic decydować; może to być wiszący link.mv dest src
,ln [ -s ] dest src
,cp dest src
, ...Osobiście wolę unikać zapamiętywania X, na rzecz wiedzy, gdzie szukać X, gdy jej potrzebuję. Jestem także fanem postawy „lepiej, niż przepraszam”, dlatego zawsze lubię uważnie sprawdzać, co piszę, zwłaszcza jako root.
W takim przypadku odpowiedź znajduje się dosłownie w pierwszych wierszach strony podręcznika:
Nie zasugerowałbym tego, gdyby wymagało to zagłębienia się na stronie podręcznika, ale ponieważ jest to na samym początku, IMHO jest warte 3 sekund, które potrzeba na wpisanie
man ln
i wyjście.źródło
Podobnie do cp, który mentalnie czytam jako „skopiuj to do tego”, czytam polecenia ln jako „link do tego”.
źródło
Tak to pamiętam: zapomnij o celu. Innymi słowy, jeśli jestem w katalogu 1 i chcę utworzyć tutaj dowiązanie symboliczne do pliku 1, który istnieje w katalogu / some / other / dir /, po prostu zrobiłbym:
Otrzymasz dowiązanie symboliczne o nazwie plik1 w katalogu 1, które wskazuje na / some / other / dir / file1. Ze strony podręcznika użytkownika dla ln:
Pamiętaj tylko, że działa to tylko wtedy, gdy chcesz, aby dowiązanie symboliczne miało taką samą nazwę jak cel (co najprawdopodobniej ma miejsce).
źródło
Chciałbym rozwinąć odpowiedź na @ gary.
Oprócz jego odpowiedzi:
ln
polecenie może przyjmować dowolną liczbę argumentów, dzięki czemu można utworzyć wiele dowiązań symbolicznych w jednym wywołaniu (co jest przydatne, gdy jest to potrzebne).ln -s foo bar baz
, jakie jest najbardziej logiczne wyjaśnienie, które argumenty oznaczają?ln -s foo bar
jakie jest najbardziej logiczne wyjaśnienie, które argumenty oznaczają?źródło
Wyobraź sobie wersję,
ln
która pozwoliła na utworzenie wielu (symbolicznych) łączy w jednym poleceniu.Odwróciłoby to wszystko, ponieważ dowiązanie symboliczne może wskazywać tylko jeden
TARGET
na raz, a normalna konwencja wiersza poleceń polega na umieszczaniu powtarzającej się części na końcu wiersza poleceń, np.grep PAT [FILE]...
źródło
„
ls
pokazujea -> b
takln a b
”Pamiętaj tylko, że to źle.
źródło
ls -l
:link -> target
może pomylić twój pomysł na konfiguracjęln
wiersza poleceń. Obawiam się jednak, że to niewiele pomoże.