根据 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 ..
如果当前目录和父目录都不存在了,怎么可能成功地进行目录更改呢?
因为它们仍然存在,只要您的 shell(或其他进程)将它们保持打开状态,或者作为它们的当前目录。这类似于文件在最终用户关闭之前一直存在的方式,尽管对于目录来说它的用处不大,因为其中不能包含文件(取消链接时目录必须为空)。
即使没有-e
,cd
也会抱怨,但目录更改仍然会如您所见。在这里,我们可以区分目录和权限,但它仍然没有任何用处:
/tmp$ mkdir -p test/a/b
/tmp$ chmod 0700 test/a/b; chmod 0770 test/a
/tmp$ cd test/a/b
/tmp/test/a/b$ rmdir ../b ../../a
/tmp/test/a/b$ ls -ld .
drwx------ 0 user group 0 Mar 7 18:51 ./ # This is 'a'
/tmp/test/a/b$ cd -P ..
cd: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory
$ ls -ld .
drwxrwx--- 0 user group 0 Mar 7 18:51 ./ # this is 'b'
$ touch foo
touch: cannot touch 'foo': No such file or directory
我想不出另一种方法可以将工作目录更改为无法确定完整路径的目录。可以cd
进入一个您对中间目录没有读取权限的目录。但即使在这种情况下,您也可以直接或通过手动解析所有符号链接来知道您所采用的路径。
至少在 Linux 上,getcwd()
即使进程本身无法读取中间目录名称,也会告诉当前目录的路径。尽管手册页确实提到了chroot
s 和 mount 命名空间作为目录中进程的可能方法,但它无法通过名称访问。
答案2
1 作为退出代码表示失败,而不是成功。所以cd -Pe ..
正确表明更改后无法确定当前目录。
据我所知,你关于何时-Pe
有必要的说法是正确的。在其他情况下,例如,如果指向已删除目录的符号链接已损坏,cd
则会失败,并显示错误消息和退出代码 1(不带-Pe
.
看bash cd 选项示例,例如: cd -Pe@ $directory有关此的更多信息...