Відповіді:
Символьне посилання насправді зберігає шлях, який ви надаєте буквально, як рядок¹. Це означає, що ваше посилання ~/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.