Если я создаю символическую ссылку в терминале с помощью команды, подобной
ln -s /path/to/some/directory symbolicLink
, а затем следую по ссылке с
cd symbolicLink
~/symbolicLink/
, хотя он фактически показывает ~/path/to/some/directory/
(конечно, при условии, что ссылка была сделана в ~
). Это означает, что если я затем наберу cd ..
, меня снова переведут на ~
, потому что терминал «думает», что это родитель cwd.
Что бы мне нужно было изменить, чтобы cd ..
вместо этого привело меня к ~/path/to/some/
, то есть к реальному родителю ~/path/to/some/directory/
?
См. https://stackoverflow.com/questions/10456784/behavior-of-cd-bash-on-symbolic-links .
Вы можете использовать «cd -P» для перехода в «настоящий» родительский каталог. См. Первый комментарий в верхнем ответе о том, как сделать это поведением по умолчанию.
В поведении cd -P
есть тонкое предостережение (из-за его длины он опубликован как ответ):
$ dir1=$(mktemp --directory)
$ dir2=$(mktemp --directory)
$ ln -s -- "$dir1" /tmp/start
$ ln -s -- "$dir2" "$dir1"
$ cd "/tmp/start/"*
$ cd -P ..
Что должен печатать pwd
сейчас? Логически, это может быть либо
$dir1
, если cd -P ..
делает cd ..
первым и cd -- "$(readlink -f)"
после, либо /tmp
, если cd -P ..
делает cd -- "$(readlink -f)"
сначала и cd ..
потом. Фактически это делает последнее, а это означает, что pwd
интуитивно на два уровня выше, чем «родительский» каталог.
Я чувствую вашу боль - из-за этого поведения я считаю bash
в основном сломанным для интерактивного использования.
tcsh
- гораздо более удобная оболочка для интерактивного использования. Оставьте bash
для программирования (если вы настаиваете на написании сценариев оболочки, когда среди многих языков сценариев есть намного лучшие альтернативы).
Чтобы изменить оболочки для любого пользователя, введите chsh
в командной строке и следуйте инструкциям (опять же, я рекомендую /bin/tcsh
и превосходную книгу О'Рейли Использование csh и tcsh ). , доступно почти ничего не используется).
Альтернативный способ - запустить:
cd $(/bin/pwd)/..