Руководство по Bash дает немного больше деталей.
cd -P
гарантирует, что в итоге вы получите "настоящий" путь:
$ cd /tmp
$ mkdir -p a/b
$ ln -s a/b b
$ cd b
$ pwd
/tmp/b
$ cd -P ../b
$ pwd
/tmp/a/b
Использование -P
означает, что симлинк с b
на a/b
разыменован. Взаимодействие с ...
заключается в том, что ...
обычно обрабатывается путем удаления предыдущего компонента пути, если он есть; а не путем проверки пути на диске. Если вы используете много симлинков, это может привести к путанице.
cd -L
эквивалентен стандартному cd
.
Текущий рабочий каталог не может быть определен, если он был удален:
$ cd /tmp
$ mkdir -p c/d
$ cd c/d
$ rmdir ../d ../../c
$ cd ...; echo $?
cd: ошибка при получении текущего каталога: getcwd: невозможно получить доступ к родительским каталогам: Нет такого файла или каталога
0
v.
$ cd -Pe ...; echo $?
cd: ошибка при получении текущего каталога: getcwd: невозможно получить доступ к родительским каталогам: Нет такого файла или каталога
1
В этом я не уверен (я могу представить, как это будет выглядеть, но Bash просто говорит "cd
: -@
: invalid option"; у меня сложилось впечатление, что сейчас это доступно только на Solaris, там нужен O_XATTR
).