ln -s зі шляху відносно pwd


26

Я намагаюся створити купу символічних посилань, але не можу зрозуміти, чому це працює

ln -s /Users/niels/something/foo ~/bin/foo_link

поки це

cd /Users/niels/something
ln -s foo ~/bin/foo_link

не.

Я вважаю, що це має щось спільне із foo_linkпосиланням на foo, /Users/niels/binа не з ним/Users/niels/something

Тож питання полягає в тому, як я можу створити символічне посилання, яке вказує на абсолютний шлях, не фактично вводячи його?

Для довідки я використовую Mac OS X 10.9 та Zsh.

Відповіді:


33

Найпростіший спосіб зв’язатися з поточним каталогом як абсолютний шлях, не набираючи весь рядок шляху

ln -s "$(pwd)/foo" ~/bin/foo_link

The target(Перший) аргумент для ln -sкоманди працює щодо місця розташування символічного посилання, а НЕ в поточному каталозі. Це допомагає знати, що, по суті, створене символьне посилання (другий аргумент) просто містить текст, який ви надаєте для першого аргументу.

Тому якщо ви зробите наступне:

cd some_directory
ln -s foo foo_link

а потім перенесіть це посилання навколо

mv foo_link ../some_other_directory
ls -l ../some_other_directory

ви побачите, що foo_link намагається вказатиfoo каталог, у якому він перебуває. Це також працює з символічними посиланнями, що вказують на відносні шляхи. Якщо ви зробите наступне:

ln -s ../foo yet_another_link

а потім рухайтеся yet_another_link до іншого каталогу і перевірте, куди він вказує, ви побачите, що він завжди вказує ../foo. Це призначене поведінку, оскільки багато разів символічні посилання можуть бути частиною структури каталогу, яка може перебувати в різних абсолютних шляхах.

У вашому випадку, коли ви створюєте посилання, ввівши

ln -s foo ~/bin/foo_link

foo_linkпросто містить посилання fooна його місцезнаходження. Ставлення $(pwd)перед назвою цільового аргументу просто додає абсолютний шлях поточної робочої директорії, так що посилання створюється з абсолютною ціллю.


"... допомагає уявити, що створене символьне посилання просто містить текст ...." Хіба це не буквальна істина?
Wildcard

1
Це є. Можливо, я міг би змінити уяву, щоб "знати" або "зрозуміти".
Ахілея

Можливо, я знову заплутався (знову). Здається, де ви говорите "ціль", ви маєте на увазі "джерело". source_file(Перший) аргумент де посилання вказує, що дослівно то , що ви входите в команду. target_file(Другий) аргумент стає ім'ям посилання , якщо то , що ви вводите не є каталогом, в цьому випадку ім'я посилання таке ж , як базове ім'я з , source_fileале поміщена в каталозі target_file.
Чарлі Горічаназ

Ти маєш рацію, ̶ ̶t̶h̶e̶r̶e̶'̶s̶ помилку в ̶a̶n̶s̶w̶e̶r̶.̶ CRAZY , як вона ̶d̶i̶d̶n̶'̶t̶ спіймані ̶s̶o̶o̶n̶e̶r̶.̶ ̶F̶i̶x̶i̶n̶g̶.̶ Ні, відповідь була прав. До lnсторінка керівництва, targetє першим аргументом (де посилання вказує на ) , тоді як другий аргумент просто згадується як link( sourceне згадується).
Ахіллеа

3
У linux (gnu ln) сторінка man називає перший аргумент, targetа другий link( man7.org/linux/man-pages/man1/ln.1.html ). Але в BSD (включаючи OS X) перший називається, sourceа другий target( freebsd.org/cgi/man.cgi?ln ). Досить заплутано.
cristoper

5

Використання прапора -r( --relative) зробить цю роботу:

ln -sr foo ~/bin/foo_link

4
Остерігайтеся, що -rце GNUism, тобто не POSIX, тому не буде працювати у випадку OP, оскільки стандартна lnкоманда OS X базується на BSD.
jlliagre

2

Щоб зберегти певний текст, ви можете зробити це

ln -s "$PWD"/foo ~/bin/foo_link

@Freddy, це залежить від оболонки. У рибі чи zsh було б добре. У Bourne-подібних оболонках, включаючи bash та зі значенням за замовчуванням $ IFS, SPC дійсно буде проблемою, але також і TAB, NL та всіх символів, що поширюються (принаймні *, ?та [...]).
Стефан Шазелас

@ StéphaneChazelas Так, ти маєш рацію, і питання позначено тегом bash, тому загалом це гарна ідея. Моє погано, я повинен був бути більш конкретним.
Фредді

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.