Ser*_*nyy 102 cd-command
我一直在关注的教程之一简要说明cd .没有用。当尝试复制符号链接递归中OP 显示的问题时- 是什么让它“重置”?,我也尝试过cd .,它显示出与 OP 描述的相同效果(增长$PWD变量),可以用cd -P.
这让我想知道,有没有人实际上想要使用的情况cd . ?
Olo*_*rin 156
我认为这是对问题的过度思考。cd .可能不是在通常的事情过程中手动运行的东西,但它绝对是可以在程序执行中出现的东西(想想你可能会cd进入包含文件的目录的任何情况,其路径由用户提供)。因此,它不必具有某些特定用途:只要它满足 的通常语义cd <some-path>,它就是有用的。
Ser*_*nyy 127
自执行最后一个命令以来,目录的路径可能已更改,并且没有cd .bash 和 ksh93 外壳将依赖于问题中链接的帖子中描述的逻辑工作目录,因此调用cd .使外壳发出getcwd()系统调用将确保您当前路径仍然有效。
在 bash 中重现的步骤:
mkdir ./dir_no_1; cd ./dir_no_1mv dir_no_1 dir_no_2echo $PWD和pwd. 请注意,该目录已被外部重命名;shell 的环境还没有更新。cd .; pwd; echo $PWD。请注意该值已更新。但是ksh93并没有更新环境信息,所以cd .在ksh93中实际上可能没有用。在/bin/dashUbuntu 和其他基于 Debian 的系统上,cd .返回dash: 3: cd: can't cd to .错误,但cd -P .有效(与 ksh93 不同)。
小智 55
另一个用例cd .是当您当前所在的目录已被删除然后再次创建时。考虑尝试以下 -
tempcd temp 然后做一个 lstempls: cannot open directory .: Stale file handlecd . 然后做一个 ls 工作正常roa*_*ima 16
以编程方式,它作为无操作很有用。考虑从外部输入提供的路径。
read -p "Path to file: " p
dirn=$(dirname "$p")
file=$(basename "$p")
echo "dirn=$dirn, file=$file"
cd "$dirn"
ls -ld "$file"
Run Code Online (Sandbox Code Playgroud)
使用诸如“fred.txt”之类的路径,目录将变为.,导致cd .
Gre*_*ods 11
注意 ”。” 是指定作为任何进程(当然包括 shell 进程)的当前工作目录打开的文件名的正确方法,以及“。” 始终是任何和所有目录(包括当前工作目录)中文件的有效名称。.如果例如底层的当前工作目录已被删除(或变得“坏”,例如陈旧的 NFS 句柄),则该名称可能不是进程的给定实例的文件的有效名称,但它是有效名称保证存在于每个有效目录中的文件。
So. 必须是任何接受目录名称的命令的有效参数,因此在标准 shell 中cd .必须是有效命令。
是否cd .有用取决于shell实现。如前所述,如果 shell 在调用底层chdir系统调用后重置其当前工作目录的完整路径名的内部概念,例如如果底层目录(或其某些父目录)已被重命名,则它可能很有用。
至少有一些贝壳,我知道(/bin/sh在FreeBSD和NetBSD)将转换cd ""成cd .,这可以说是被描述的功能,以支持在shell脚本,其中一个变量可能会(即转换一个空的变量替换成“用作参数编程使用什么都不做”的结果),尽管 FreeBSD 的提交历史表明该更改是直接由于添加了 POSIX 支持以防止失败chdir(""),而 POSIX 要求必须失败。
其他一些 shell 会将 替换为.它们存储为当前工作目录的完全限定路径名的任何内容,因此对它们来说,这可能允许Sahil Agarwal 的回答中提到的行为。