
В bash 4.4.12
, help cd
говорит:
Options: -L force symbolic links to be followed: resolve symbolic links in DIR after processing instances of `..' -P use the physical directory structure without following symbolic links: resolve symbolic links in DIR before processing instances of `..' -e if the -P option is supplied, and the current working directory cannot be determined successfully, exit with a non-zero status -@ on systems that support it, present a file with extended attributes as a directory containing the file attributes
Мне трудно уложить эти слова в голове, и мой Google-фу ничего не может выдать.
- Какой пример показывает, что
cd -P
предпочтительнееcd
? - Чем
cd -L
отличается от стандартаcd
? - Как могло случиться, что рабочий каталог не удалось определить успешно?
- Какой пример использования
-@
?
решение1
TheРуководство по Башудает немного больше подробностей.
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: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory 0
в.
$ cd -Pe ..; echo $? cd: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory 1
В этом я не уверен (я могу себе представить, как это будет выглядеть, но Bash просто выдает «
cd
:-@
: invalid option»; у меня сложилось впечатление, что в настоящее время это доступно только в Solaris, для этого нужноO_XATTR
).