Відповіді:
Символьне посилання насправді зберігає шлях, який ви надаєте буквально, як рядок¹. Це означає, що ваше посилання ~/mylink
містить " .
" (один символ). Коли ви отримуєте доступ до посилання, цей шлях інтерпретується відносно того, де знаходиться посилання, а не там, де ви були, коли ви робили посилання.
Натомість ви можете зберігати фактичний шлях, який ви хочете, за посиланням:
ln -s "$(pwd)" ~/mylink
використовуючи підстановку команд, щоб помістити висновок pwd
(ім'я робочого каталогу) у ваш командний рядок. ln
бачить повний шлях і зберігає його у вашому символьному посиланні, яке потім вкаже на потрібне місце.
¹ Більш-менш.
Ви повинні використовувати:
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
.