Поради щодо запам'ятовування порядку параметрів для ln?


64

Я lnписав символічні посилання протягом багатьох років, але я все одно отримую порядок параметрів неправильно.

Як правило, я пишу:

ln -s a b

а потім дивлячись на вихід, щоб нагадати про себе.

Я завжди уявляю себе a -> bтаким, яким я його читаю, коли насправді навпаки b -> a. Це відчуває контр-інтуїтивно, тому я вважаю, що я завжди вдруге здогадуюсь про себе.

Хтось має поради, які допоможуть мені запам'ятати правильний порядок?


11
Іноді це допомагає сказати це вголос, коли ви набираєте його в "символічному посиланні на aі називаєте b"
jsotola

2
Ви створюєте другий параметр так само, як і cp, і ви створюєте посилання. Але якщо ви зрозуміли це неправильно, не хвилюйтесь, оскільки ви не зможете перезаписати існуючий файл чи посилання на нове посилання.
sudodus


1
Подумайте про це як про псевдонім поганого хлопця. Його завжди згадують спочатку справжнім іменем, потім своїм псевдонімом. Наприклад: Тоні Балоні, він же Оскар Мейєр. Або у випадку вашого посилання, ln -sab означає "Файл-a також відомий як" Файл-b ".
Scottie H

1
ln source target. Те саме cp source target, що mv source target,; ...
користувач207421

Відповіді:


40

Я використовую наступний: lnмає форму одноаргументной (2 - й форму , перераховану в сторінках керівництва ) , в якому потрібно тільки мета (бо , як може lnпрацювати на всіх , не знаючи мети) і lnстворює посилання в поточному каталозі. Форма з двома аргументами є доповненням до форми одного аргументу, тому ціль завжди є першим аргументом.


3
Зауважте, що форма без шляху призначення / цілі є розширенням до специфікації POSIX ln.
Kusalananda

1
@kusa: Ви бачили посібник 1971 року у моїй відповіді з формою з одним аргументом? Як це може бути розширення до posix, якщо воно було там у 1971 році? --- "Якщо вказано ім'я2, посилання має це ім'я"

@SP Я не впевнений, що я розумію, що ти маєш на увазі. Ви хочете сказати, що історична реалізація якось перекручує поточний стандарт POSIX?
Kusalananda

1
Я також бачу. Різні імена, однакові аргументи, принаймні. Я не здогадувався, що Gnu є єдиним із цими назвами аргументів.

2
Тут було багато хороших відповідей (особливо рима @loa_in_), але я збираюся піти з цією. Заявивши, що порядок параметрів є послідовним (ігноруючи -t), це відчувається майже як доказ. " lnстворює посилання в поточному каталозі. Форма з двома аргументами є доповненням до форми одного аргументу, тому ціль завжди є першим аргументом". Оскільки має сенс, що це було б так, коли ми розглядали другу форму, я думаю, це допоможе мені запам'ятати.
Жро

85

Я йду повз " lnце як cp. Джерело" має стати першим ".


20
... і подібне mv. mv, cpі lnвсі беруть наявний файл як перший аргумент, а призначений файл призначення або ім'я як другий аргумент.
Ганс-Мартін Моснер

7
Це ганьба , що memcpy, і strcpyт.д. працюють навпаки.
Аркадіуш Драбчик

6
@ Hans-MartinMosner, за винятком того, що коли ви створюєте символічне посилання, це не повинно бути наявним файлом ...
ilkkachu

1
@ilkkachu Ти маєш рацію. Без правила без винятку :-)
Ганс-Мартін Моснер

1
@ArkadiuszDrabczyk З іншого боку, щось на зразок memcpy(dest,src,n);карт дуже добре dest = src;. Іншими словами, встановіть (перший nбайт of) dest, рівний (першим nбайтам) src.
CVn

10

Більшість Unices документує lnкоманду як

ln source target

(Я пропускаю тут варіанти тощо)

Приклади:

  • Стандарт POSIX

    ln [-fs] [-L|-P] source_file target_file
    
  • OpenBSD :

    ln [-fhLnPs] source [target]
    
  • NetBSD та FreeBSD

    ln [-L | -P | -s [-F]] [-f | -iw] [-hnv] source_file [target_file]
    
  • macOS

    ln [-Ffhinsv] source_file [target_file]
    
  • Соляріс

    /usr/bin/ln [-fns] source_file [target]
    
  • AIX

    ln [ -f | -n ] [ -s ] SourceFile [ TargetFile ]
    

Посібник GNU lnвикликає source ціль та ім'я target посилання .

Чи не звертаючи уваги на вибір GNU слів, то lnутиліта слід такий же семантика , як , наприклад , mvі cpв тому , що мета є те , що створюється з джерела .

Тому

ln -s a b

створило б символічне посилання, що bвказує на a.

Зауважте також, що при створенні символьних посилань джерелом є просто рядок, що представляє, на що має вказувати символічне посилання. Зазвичай не робиться перевірка на підтвердження того, що вона вказує на щось корисне:

$ ln -s "hello world" README.txt
$ ls -l
total 0
lrwxr-xr-x  1 kk  wheel  11 Sep 15 11:39 README.txt -> hello world

5
Я повністю звинувачую документацію GNU у тому, що люди взагалі помиляються в цьому. Їх формулювання зрозуміле заднім числом, але об'єктивно заплутане.
Конрад Рудольф

6
@KonradRudolph, Навпаки, формулювання GNU здається мені місцем. Утиліта створює посилання з якоюсь назвою, вказуючи кудись. «Ім'я Link» є свого роду очевидним, і «мета» є цілком хороший опис чого - то , що вказав на . Як анекдот, мені все одно доводиться іноді думати, який спосіб ln -s a bпрацює, і це не має нічого спільного з формулюванням GNU, оскільки я не думаю, що я ніколи не переглядав фразування на сторінці man. : D (Простіше просто запустити, ln -si a bколи не впевнений, скаржиться, якщо bвже є.)
ilkkachu

1
@KonradRudolph, хоч і технічно, називати його "цільовим" у випадку жорсткого посилання неправильно , оскільки це фактична мета не існуюче ім'я, а індез. Мені цікаво, чи люди з ГНУ думали, що звичайному користувачеві не варто думати про це так докладно.
ilkkachu

Цікаво зазначити, як згадувалося в коментарях до відповіді @ gary, що ціль не є обов'язковою у стандарті POSIX.
Жро

@kusa: з "ln -s AB --- скопіюйте лише ім'я файлу в B" Я прийняв вашу інтерпретацію у дещо зміненому контексті. Я навіть можу погодитися з вашим радикальним прикладом "привіт світ". "Тільки ім'я файлу" - це рядок. Просто хочу повідомити вам, що я трохи відредагував та додав багато.

7

Якщо це допомагає комусь: я звик думати про це як "ln що де ", що допомагає мені пам'ятати, що перший аргумент ("що") - це існуючий файл, другий ("where") - це місце ставити (посилання на) це. На відміну від міркувань у більшості інших відповідей, це не що інше, як жалюгідна фраза, яку я подумки можу переказати собі під час введення команди, яка служить допоміжним засобом пам’яті. Це, мабуть, не буде корисним для всіх, але я підозрюю, що це допоможе деяким людям.

Це допомагає, щоб інші стандартні команди управління файлами використовували ту саму умову, тому я можу зробити те ж саме для cpі mv.


4
Мені цікаво зрозуміти, чому це було знято. Тут не так багато, що могло б помилитися - я змішав замовлення чи щось таке?
David Z

Я особисто вважаю, що "ln what where" все ще не є однозначним без пояснення: що може бути або "на що вказується посилання?" (правильно) або "що щось пов'язує?" (неправильно). Те саме з де: "куди вказується посилання?" (неправильно) або "де слід створити посилання" (правильно). Тож це не обов'язково так сильно допомагає, якщо ви самі вдруге здогадуєтесь. Запам'ятовування cp та mv повинно допомогти.
125_m_125

Всі ми очікуємо, що команда UNIX включить свої файлові аргументи після інших типів аргументів (як, наприклад, grep, для exmaple). ln створює файл певного типу із заданим вмістом. Що файлова система робить щось особливе, і ми зазвичай ставимо шлях до якогось вихідного файлу в ній випадково до ln. Для прикладу я можу написати текстовий редактор, який зберігав вміст його першого рядка в симпосилання, що називається 1, і т. Д. Це було б непросто, але це підкреслює, що ln створює якийсь файл з деяким текстовим вмістом, нічого більш-менш, і робить порядок аргументу здається логічним.
Денні

@ 125_m_125 Чергова інтерпретація, яку ти представив, не має для мене особливого сенсу, але це нормально; ця допомога пам’яті не для всіх.
David Z

6

Нещодавно я чув чудовий спосіб згадати цю конкретну річ: риму

Щось старе, щось нове,

щось запозичене, щось синє,

і шість футів у взутті.

Перший вірш - це те, що аргументи ln: щось старе, а потім назва нового запису каталогу.


3
NAME    ln -- make a link
SYNOPSIS    ln name1[ name2 ]
DESCRIPTION ln creates a link to an existing file name1. 
            If name2 is given, the link has that name; 

З 1971 р . Посібники Unix First Edition .

Є друга , проста, синтаксична форма.


Змінити: Я ставлю FILE або FILENAME замість TARGET --- бачити коментарі і т.д. Дивись також дуже довго додавання в нижній частині, звертаючись до айсберг, тверді і м'які з ln, а не тільки кінчик його.


Отже, GNU lnмає таке:

ln [opt] FILENAME

In the 2nd form, create a link to FILENAME in the current directory.

де вам не потрібно ім'я посилання. Після ln -s /usr/lib/modulesтого, як ви отримаєте

modules -> /usr/lib/modules

з тим самим іменем, що і FILENAME ("ціль" або "джерело"), де ви знаходитесь. Ні вибору, ні плутанини.

Тепер, якщо ви більш вимогливі і хочете, щоб посилання було створене під іншим ім'ям та / або деінде , ви додасте це бажання як ім’я чи шлях. Справжня ціль на першому місці, додаткова фантазійна нова назва посилання друга.


Або ви кажете: "Я знаю цю позначку стрілки ls -lдля посилань. У мене немає стрілки в оболонці, щоб показати напрямок моєї посилання. Тому я повинен її перевернути".

Ви створюєте його в одному напрямку, щоб ви могли використовувати його в іншому.

(КІНЦЯ ВІДПОВІДЬ-ЗАПИТАННЯ)


На іншому рівні слово "посилання" саме по собі несе в собі глибоке приховане подвійне значення. Символічні посилання з’явились пізніше, тому в перші дні посилання було лише посиланням. Не було м'якого і твердого, не було -sваріанту. І тепер я навіть використовую символіку-джерело-ціль:

mv    A B   --- move the whole file to B (dir or new name)
cp    A B   --- copy whole file (mv and cp are "the same" here)    
ln    A B   --- copy whole file MINUS data blocks (=copy only inode and name), and increase "link count" for track keeping

На цьому етапі є посилання, але немає жорстких і м'яких, і ls -lстрілки не показуються, тому що в (жорсткому) зв’язку немає напряму. "Посилання" на тому етапі еволюції unix означало, що ім'я файлу "B" (запис в каталозі "B") у файловій системі вказує на той самий inode, на який вказує ім'я файлу "A".

Файли A і B "пов'язані" разом, оскільки вони поділяють однакові блоки. Отже, з кожним rm ядро ​​має перевірити: чи я видаляю / звільняю блоки цього файлу на диску, чи є інший файл, пов'язаний з тими ж блоками? Для цього використовується лічильник посилань.

Скажіть, ви хочете, щоб великий файл у / tmp grom видалявся та роби ln /tmp/bigfile. Тепер у вас є великий bigfile у вашому робочому режимі. Після очищення / tmp та переміщення "оригіналу" ви радісно продовжуєте використовувати ті самі блоки даних. Ви не отримаєте мертве або звисаюче посилання, у вас нормальний файл. Вказуючи не на файл, а лише на файлову систему, як це робить кожен запис в режимі dir. Тільки зараз "чистка" / tmp не настільки ефективна, як була. Він виглядає порожнім, і він є, але блоки на розділі не звільняються.

Навіть незважаючи на те, що жорстке посилання не коштує простору, як це робить cp, опосередковано.

Додавання ln -sдо послідовності вище:

ln -s A B   --- copy only the file's name to "B"   

Тепер "B", м'яке посилання, містить лише рядок з назвою шляху. Це "м'яка" інформація. Технічно "А" і "В" не пов'язані між собою. Але все ж B - це "посилання" в новому сенсі, що ви можете використовувати збережене ім'я шляху як ярлик до "A". Тепер це "посилання на A" (період), а не "пов'язане з inode файла A"

Обидва види посилань можуть заплутати не тільки людей, але й ядро ​​/ fs. Сторінка 1971 року зазначає: "BUGS: посилання двічі резервуються і відновлюються як окремі файли з окремими вводами".

Жорсткі посилання на каталоги (рідкісні / заборонені) можуть легко призвести до засмічення.

М'які посилання на каталоги (дуже поширені) можуть призвести до вічних циклів - їх слід розпізнати утилітами / ядром.

Практичний приклад з баш

Починаючи зі звичайного файлу "F" ...

ln F Fhard

... робить Fhard такого ж розміру, що і F, але вони БУДУТЬ тепер відображатися у темно-червоному БЕЗ стрілок ls -l --color. Через statпоказ "Посилання: 2" у зв'язку з "Inode: xyz". Жорстке з'єднання F перетворює F себе в жорстке з'єднання. Обидва є / залишаються файли "звичайний файл". Але обидва мають inode із кількістю посилань вище 1.

   ln -s F Fsoft

... робить невеличкий "нерегулярний" файл "Fsoft" з файловим "символічним посиланням" --- навіть більше економії місця, ніж порожній реж. A не ls -lпоказує нічого особливого для "F". Для Fsoft показаний розмір становить 1 байт, оскільки рядок "F", і Fsoft -> Fвідображається як ім'я. Не потрібно розфарбовувати м'яке посилання, щоб його розпізнати. Тому що в короткій формі ls -Fви отримуєте додану згорнуту ланцюжок @ :Fsoft@

З ls -lцим виглядає так:

-rw-r--r-- 2 root root 6070340 Sep 16 16:28 F
-rw-r--r-- 2 root root 6070340 Sep 16 16:28 Fhard
lrwxrwxrwx 1 root root       1 Sep 16 16:31 Fsoft -> F

Fhard має розмір і тип F.

Fsoft має ім'я F та довжину імені F як розмір та інший тип файлу.

Короткий ls -sF:

5932 F    5932 Fhard     0 Fsoft@

додавання --block-size=1також не дає однакових розмірів. Fsoft має розмір "один байт, нульові блоки". F і Fhard відхиляються паралельно:

6074368 F  6074368 Fhard    0 Fsoft@

Щоб побачити, чи Fsoft звисає чи ні, lsви можете використовувати кольори.

ORPHAN 40;31;01 # symlink to nonexistent file, or non-stat'able file

2

Дійсно корисно пам’ятати, що ім’я посилання необов’язкове. Якщо його не вказано, використовується базове ім'я цілі посилання.

ln -s /path/to/file1 file1

ідентично повністю скасувати ім'я посилання:

ln -s /path/to/file1

Це не мало б сенсу, якби ціль посилання була згадана останньою.


1

Просто подумайте, що Unix -> AT&T -> пункт призначення праворуч:

mov %eax, %ebx  ;; AT&T style assembler syntax: %ebx register gets value of %ecx

mv foo bar    ;; foo renamed to bar

cp foo bar    ;; contents of foo go to bar

foo | bar     ;; data moves left to right in pipeline

ln abc def    ;; link to abc installed as def

"cp foo bar" означає "бар". "ln abc def" означає "abc". Якби ви зберегли символи: "foo". Саме в цьому і полягає проблема.

@ user370539 Це, мабуть, неправда; після ln abc def, abcі defє тим самим об'єктом; вони не відрізняються. Більше того, операція не впливає abc, крім збільшення кількості її зв’язків. Місце призначення def. Вказівник на об’єкт нещодавно встановлений у цьому defмісці.
Каз

@ user370539 Якщо посилання символічне, то це ln -s abc defозначає, що вміст abcзаписується до місця def. abcнавіть не потрібно нічого вирішувати; це може бути звисаючою ланкою.
Каз

Ваш коментар точно ... неправильний. Це повинно бути навпаки.
rexkogitans

@rexkogitans Моя думка, що це послідовно. Якщо замовлення «неправильно» , і підлягає скасуванню, то це повинно бути для всіх цих команд: mv dest src, ln [ -s ] dest src, cp dest src, ...
Kaz

0

Особисто я вважаю за краще уникати згадування X, на користь того, щоб знати, де шукати X, коли мені це потрібно. Я також прихильник "краще безпечного, ніж шкода" ставлення, тому завжди люблю ретельно перевіряти те, що пишу, особливо як root.

У цьому випадку відповідь буквально знаходиться в перших рядках сторінки сторінки:

   ln [OPTION]... [-T] TARGET LINK_NAME
   (...)
   In the 1st form, create a link to TARGET with the name LINK_NAME.

Я б не запропонував цього, якби потрібно заглибитись у сторінку, але так як це вже на початку, IMHO варто набрати 3 секунди, щоб його набрати man lnта вийти.


-1

Подібно до cp, який я подумки читав як «скопіюйте це на те», я прочитав команди ln як «зв’язати це з цим».


2
Це дуже схоже на найкращу відповідь .
Майкл

Отже, "ln -s AB" посилається на A?

-2

Ось як я це пам’ятаю: Забудь про ціль. Іншими словами, якщо я перебуваю в dir1 і хочу створити тут симпосилання до file1, який існує в / some / other / dir /, я би просто зробив:

ln -s /some/other/dir/file1

Ви отримаєте символьне посилання file1 в dir1, яке вказує на / some / other / dir / file1. З довідкової сторінки для ln:

ln [ВАРІАНТ] ... TARGET (2-й клас) ... У 2-му класі створіть посилання на TARGET у поточному каталозі.

Просто майте на увазі, що ця робота працює лише в тому випадку, якщо ви хочете, щоб символьна посилання мала те саме ім'я, що і цільове (що, швидше за все, так і є).


Чи можете хтось пояснити, чому це було знято? Я просто копіюю-вставляю зі сторінки man (і відповідно приписую). Це допоможе іншим зрозуміти, як розміщувати інформацію про SE. Дякую.
Скакаючий Зайчик

я можу пояснити: це культурне зіткнення. Не хвилюйся. Перевірте інші відповіді, коментарі ...

-3

Я хотів би розкрити відповідь на @ gary.

На додаток до його відповіді: lnкоманда може приймати довільну кількість аргументів, так що ви можете створити кілька посилань за один виклик (що зручно, коли вам це потрібно).

  1. Зі ln -s foo bar bazсвоїми знаннями, коли ви стикаєтесь , що є найбільш логічним поясненням, які аргументи означають що?
  2. Коли ви стикаєтесь з відповіддю на номер 1, ln -s foo barяке найбільш логічне пояснення, які аргументи означають що?

1
Якщо у вас є додаток до відповіді Гері, будь ласка, запропонуйте це як редагування. Оскільки два ваші останні (гіпотетичні?) Запитання роблять цей "Відповідь" більш схожим на друге запитання.
Джефф Шаллер

-3

Уявіть версію, lnяка дозволила вам створити кілька (символічних) посилань в одній команді.

Synopsis: ln -s TARGET NEW_LINK...
Example: ln -s target_file  new_link_1  new_link_2  new_link_3

Зважати на це не потрібно, оскільки символьне посилання може вказувати лише на одне TARGETза одним, а звичайна конвенція командного рядка - ставити повторювану частину в кінці командного рядка, наприкладgrep PAT [FILE]...


-6

" lsпоказує a -> bтак ln a b"

Просто пам’ятайте, що це неправильно.


6
Я завжди пам’ятаю «щось-щось завжди не так». Але який шлях неправильний? У цьому проблема. Тоді ця проблема стає моїм самим другим здогадком, навіть коли я це правильно розумію. Тому що я фактично не можу згадати правильний порядок!
Жро

Я думаю, я розумію, що ви маєте на увазі: результат ls -l: link -> targetможе заплутати ваше уявлення про те, як налаштувати lnкомандний рядок. Але я боюся, що це не дуже допоможе.
sudodus
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.