根据 Bash 手册页,该-e
选项会导致目录更改成功后cd
返回不成功状态。
如果 -e 选项与 -P 一起提供,并且在成功更改目录后无法成功确定当前工作目录,则 cd 将返回不成功状态。
$ cd
$ mkdir -p test/a/b
$ cd test/a/b
$ rmdir ../b ../../a
$ cd -Pe ..; echo $?
cd: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory
1
为什么以上返回1
?cd -Pe ..
如果当前目录和父目录不再存在,怎么可能成功地更改目录?
另外,如果我想cd
在每次无法更改到所需目录时返回不成功的返回状态,我必须添加的情况是什么-Pe
?据我了解,只有在.
或..
的论点中使用 时才有必要cd
。
1 作为退出代码表示失败,而不是成功。所以
cd -Pe ..
正确地表明它在更改后无法确定当前目录。据我所知,你是对的,什么时候
-Pe
是必要的。在其他情况下,例如,如果指向已删除目录的符号链接损坏,cd
则会失败并显示错误消息和退出代码 1 而没有-Pe
.请参阅bash cd 的选项示例,例如:cd -Pe@ $directory以了解更多信息...
因为它们仍然存在,只要你的 shell(或其他进程)保持它们打开,或者作为它们的当前目录。这类似于文件在最终用户关闭它们之前的存在方式,尽管使用目录它不太有用,因为您不能在其中包含文件(取消链接时目录必须为空)。
即使没有
-e
,cd
抱怨,但目录更改仍然如您所见。在这里,我们可以将目录与权限区分开来,而不是它仍然有任何用处:我想不出另一种方法来将工作目录更改为无法确定完整路径的目录。可以
cd
进入一个您对中间目录没有读取权限的目录。但即使在这种情况下,您也可以直接或通过手动解析所有符号链接来知道您采用的路径。并且至少在 Linux 上,
getcwd()
它会告诉当前目录的路径,即使进程本身无法读取中间目录名称。尽管手册页确实提到了chroot
s 和 mount 命名空间作为进程在目录中的可能方法,但它不能通过名称访问。