Відновлення функціональності "cd .." після переходу символічного посилання


13

Якщо я створюю символічне посилання в терміналі з такою командою

ln -s /path/to/some/directory symbolicLink

а потім перейдіть за посиланням на

cd symbolicLink

Термінал, здається, думає, що cwd ~/symbolicLink/навіть незважаючи на те, що він насправді показує ~/path/to/some/directory/(припускаючи, що посилання було зроблено ~, звичайно). Це означає, що якщо я потім набираю, cd ..мене повертають назад ~, оскільки термінал "думає", це батько cwd.

Що мені потрібно змінити, щоб cd ..замість цього взяти мене ~/path/to/some/, тобто справжнього батька ~/path/to/some/directory/?

Відповіді:



5

У cd -Pповедінці є тонкий застереження (розміщений як відповідь через тривалість):

$ dir1=$(mktemp --directory)
$ dir2=$(mktemp --directory)
$ ln -s -- "$dir1" /tmp/start
$ ln -s -- "$dir2" "$dir1"
$ cd "/tmp/start/"*
$ cd -P ..

Що слід pwdнадрукувати зараз? За логікою, це може бути будь-яке

  1. $dir1, якщо cd -P ..це робиться cd ..спочатку і cd -- "$(readlink -f)"після цього, або
  2. /tmp, якщо cd -P ..це робиться cd -- "$(readlink -f)"спочатку і cd ..після цього.

Насправді це робить останнє, тобто pwdінтуїтивно на два рівні вище, ніж "батьківський" каталог.


1
Спасибі! cd -PДосі вирішує питання, з яким я стикався, але все ще корисно знати.
Вал


2

Я відчуваю ваш біль - я вважаю, що bashчерез цю поведінку в основному зламаний для інтерактивного використання.

tcshє набагато більш зручною для користувачів оболонкою для інтерактивного використання. Залиште bashпрограмування (якщо ви наполягаєте на написанні скриптів оболонок, коли серед багатьох мов сценаріїв є набагато кращі альтернативи).

Щоб змінити оболонки для будь-якого користувача, введіть chshу командному рядку та дотримуйтесь підказок (знову ж таки, рекомендую /bin/tcshта чудову книгу O'Reilly Використання csh та tcsh , доступна майже нічого, що не використовується)


З тих пір, як я написав цю відповідь, я навчився переставати хвилюватися і любити Баша за інтерактивне використання. Але я все ще не можу мати справу з типовою cdповедінкою для посилань. Я маю пам’ятати, що потрібно помістити set -o physicalв свій .bashrcабо .bash_profileдля кожної машини, яку я використовую.
dodgethesteamroller
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.