Восстановить функциональность "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/?

Val
источник

Ответы:

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есть интуитивно на два уровня выше, чем «родительский» каталог.

l0b0
источник
1
Благодарность! cd -Pвсе еще решает проблему, с которой я столкнулся, но все еще полезно знать.
Val
2

Альтернативный способ - запустить:

cd $(/bin/pwd)/..
jlliagre
источник
2

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

tcshгораздо более удобная оболочка для интерактивного использования. Оставьте bashдля программирования (если вы настаиваете на написании сценариев оболочки, когда есть много лучших альтернатив среди многих языков сценариев).

Чтобы изменить оболочки для любого пользователя, введите chshв командной строке и следуйте инструкциям (опять же, я рекомендую /bin/tcshи отличную книгу О'Рейли « Использование csh и tcsh» , доступную практически без использования).

dodgethesteamroller
источник
С тех пор как я написал этот ответ, я научился перестать беспокоиться и люблю Bash для интерактивного использования. Но я все еще не могу разобраться с cdповедением по умолчанию для символических ссылок. Я должен помнить, чтобы вставить set -o physicalмою .bashrcили .bash_profileдля каждой машины, которую я использую.
dodgethesteamroller