Создать абсолютную символическую ссылку на текущий каталог

12

Я сейчас в каталоге с очень длинным путем. Чтобы в будущем посетить его быстрее, я бы хотел создать ссылку на него.

Я старался

ln -s . ~/mylink

~/mylinkна самом деле ссылки на ~. Итак, могу ли я перейти ~к полному пути, а затем дать его ln?

Тим
источник

Ответы:

19

Символическая ссылка на самом деле хранит путь, который вы даете буквально, в виде строки¹. Это означает, что ваша ссылка ~/mylinkсодержит " ." (один символ). Когда вы получаете доступ к ссылке, этот путь интерпретируется относительно того, где находится ссылка, а не там, где вы были, когда создавали ссылку.

Вместо этого вы можете сохранить фактический путь, который вы хотите в ссылке:

ln -s "$(pwd)" ~/mylink

используя подстановку команд, чтобы поместить вывод pwd(имя рабочего каталога) в вашу командную строку. lnвидит полный путь и сохраняет его в вашей символической ссылке, которая затем будет указывать на правильное место.

Or более или менее.

Майкл Гомер
источник
2
Смотрите также "$PWD"в оболочках POSIX и ~0в zsh.
Стефан Шазелас
7

Вы должны использовать:

ln -s "$(cd . && pwd)" ~/mylink

или:

ln -s "$(pwd -P)" ~/mylink

чтобы получить правильный результат для текущего рабочего каталога. Это может быть изменено, пока вы работаете в этом, как в этом вопросе .

cuonglm
источник
1
Первый не обязательно поможет во всех оболочках (см. Этот ответ ). ОП, скорее всего, хочет использовать $PWD(путь, который он там использовал), а не $(pwd -P)(канонический путь к текущему каталогу). Если $PWDбольше не указывает на текущий каталог, то нет слов, что $(pwd -P)будет в следующую минуту.
Стефан Шазелас
@ StéphaneChazelas: см. Этот unix.stackexchange.com/questions/147693/…
cuonglm
@ StéphaneChazelas: Вы можете видеть, что "$PWD"все еще имеете старое значение, если текущая директория перемещена. PWDустанавливается только когда вы cdили инициализируете с помощью оболочки.
cuonglm
Но я говорю, что OP скорее всего захочет старый $ PWD, чем какой-либо абсолютный путь к текущему рабочему каталогу, и что в нескольких оболочках (ksh93, ash, yash), как объяснено там, вызов cdне гарантирует выполнения $ PWD или вывод pwd - путь к текущему каталогу. Вы пытаетесь защититься от чего-то, что вряд ли произойдет, но в первом решении это не обязательно эффективно, а во втором - изменение поведения.
Стефан Шазелас
1
Если кто-то делает mv после вас ln, то вы попадаете в ту же ситуацию. С другой стороны, если он это сделал cd /long/logical/path/to/some/directory, вы не хотите, чтобы ссылка указывала на /vg0/lv1/user2/app4(канонический путь), поскольку ссылка будет указывать на неправильное место, когда оно /long/logical/path/to/some/directoryуказывает куда-то еще.
Стефан Шазелас