Ответы:
Символическая ссылка на самом деле хранит путь, который вы даете буквально, в виде строки¹. Это означает, что ваша ссылка ~/mylink
содержит " .
" (один символ). Когда вы получаете доступ к ссылке, этот путь интерпретируется относительно того, где находится ссылка, а не там, где вы были, когда создавали ссылку.
Вместо этого вы можете сохранить фактический путь, который вы хотите в ссылке:
ln -s "$(pwd)" ~/mylink
используя подстановку команд, чтобы поместить вывод pwd
(имя рабочего каталога) в вашу командную строку. ln
видит полный путь и сохраняет его в вашей символической ссылке, которая затем будет указывать на правильное место.
Or более или менее.
Вы должны использовать:
ln -s "$(cd . && pwd)" ~/mylink
или:
ln -s "$(pwd -P)" ~/mylink
чтобы получить правильный результат для текущего рабочего каталога. Это может быть изменено, пока вы работаете в этом, как в этом вопросе .
$PWD
(путь, который он там использовал), а не $(pwd -P)
(канонический путь к текущему каталогу). Если $PWD
больше не указывает на текущий каталог, то нет слов, что $(pwd -P)
будет в следующую минуту.
"$PWD"
все еще имеете старое значение, если текущая директория перемещена. PWD
устанавливается только когда вы cd
или инициализируете с помощью оболочки.
cd
не гарантирует выполнения $ PWD или вывод pwd - путь к текущему каталогу. Вы пытаетесь защититься от чего-то, что вряд ли произойдет, но в первом решении это не обязательно эффективно, а во втором - изменение поведения.
mv
после вас ln
, то вы попадаете в ту же ситуацию. С другой стороны, если он это сделал cd /long/logical/path/to/some/directory
, вы не хотите, чтобы ссылка указывала на /vg0/lv1/user2/app4
(канонический путь), поскольку ссылка будет указывать на неправильное место, когда оно /long/logical/path/to/some/directory
указывает куда-то еще.
"$PWD"
в оболочках POSIX и~0
вzsh
.