我们知道该cd
命令是用来改变目录的。例如
cd dirname
有效的目录名还包括.
和..
。目的cd ..
很明确。从联机帮助页:
CDPATH 中的空目录名称与当前目录相同,即“.”。
但这样做的目的是什么呢cd .
?
答案1
的作用cd .
是用有关当前工作目录的信息更新 shell。当当前目录(的路径名)通过其他方式而不是通过cd
.
$ pwd
/tmp/shell-bash.OoVntBAM
$ mkdir dir
$ cd dir
$ pwd
/tmp/shell-bash.OoVntBAM/dir
因此,我们当前位于 下的某个位置/tmp
,在一个名为 的目录中dir
。让我们重命名当前所在的目录。
$ mv ../dir ../new-dir
那么,我们现在在哪里?
$ pwd
/tmp/shell-bash.OoVntBAM/dir
真的吗?为什么,这很奇怪。让我们确保 shell 知道我们是谁。
$ cd .
$ pwd
/tmp/shell-bash.OoVntBAM/new-dir
在脚本中,cd .
可以用来测试用户是否仍然可以访问当前目录:
if ! cd . 2>/dev/null; then
echo lost access to cwd >&2
exit 1
fi
或者,反过来说,核实在某种撤销当前用户访问权限的操作之后,当前目录将不再可访问。
失去对当前目录的访问权限的原因包括删除该目录,或者某人删除了对该目录的执行权限。
另一个例子是使用cd .
, 但带有-P
选项 ie cd -P .
。如果当前目录是通过符号链接访问的,这会将您置于“物理”目录中:
$ pwd
/tmp/shell-bash.OoVntBAM
$ mkdir dir
$ ln -s dir link-dir
$ ls -l
total 2
drwxr-xr-x 3 kk wheel 512 May 8 00:48 dir
lrwxr-xr-x 1 kk wheel 3 May 8 00:46 link-dir -> dir
现在我们有了一个目录,dir
以及到该目录的符号链接。我们通过符号链接进入目录:
$ cd link-dir
$ pwd
/tmp/shell-bash.OoVntBAM/link-dir
然后...
$ cd -P .
$ pwd
/tmp/shell-bash.OoVntBAM/dir
答案2
正确的引用cd ..
应该是:
‘..’ 的处理方式是将前一个路径名组件移回到斜杠或 DIR 的开头。
并且,是的,cd .
不应该更改当前目录,并且,是的,它不会。
但当前目录的名称可能已更改:
$ mkdir thisdir
$ cd thisdir
$ cd .
$ pwd
/home/isaac/thisdir
$ mv ../thisdir ../xxxx
$ cd .
$ pwd
/home/isaac/xxxx
或者当前目录包含符号链接或其物理目录名称已更改。
$ cd ~/ttt
$ pwd
/home/isaac/ttt
$ cd -P .
$ pwd
/home/isaac/me/init/basicdirs.d/ttt
因此,cd .
与任何其他一样使用cd DIR
,将 更改pwd
为DIR
。它可能看起来是相同的目录,但是,即使是相同的目录,DIR 也可能具有不同的名称或路径。