是否 cd 。有没有用?

Ser*_*nyy 102 cd-command

我一直在关注的教程之一简要说明cd .没有用。当尝试复制符号链接递归中OP 显示的问题时- 是什么让它“重置”?,我也尝试过cd .,它显示出与 OP 描述的相同效果(增长$PWD变量),可以用cd -P.

这让我想知道,有没有人实际上想要使用的情况cd .

Olo*_*rin 156

我认为这是对问题的过度思考。cd .可能不是在通常的事情过程中手动运行的东西,但它绝对是可以在程序执行中出现的东西(想想你可能会cd进入包含文件的目录的任何情况,其路径由用户提供)。因此,它不必具有某些特定用途:只要它满足 的通常语义cd <some-path>,它就是有用的。

  • 您可以添加以下示例: while `IFS= read Dir; 之类的循环 做 cd "$Dir"; 做点什么; 完成 &lt; &lt;(find .-type d)`。在它的过程中,find 产生 `.` 作为路径,因此命令 `cd "$Dir"` 扩展为 `cd .`。因此,在脚本中,它非常有用。 (18认同)
  • 同意,`.` 应该被视为由 `cd` 语法指定的有效路径就好了。 (12认同)
  • 例如,一个脚本实际上运行 `cd ${path_to_directory}`,但在某些时候它会发现目录是当前目录,并且 `path_to_directory = .` 所以你需要 `cd .` 来工作以防万一。 (5认同)
  • 换句话说,它的实用性在于它不需要额外的代码(`if` 检查和 `else` 子句,任何类型的特殊大小写)。 (5认同)
  • 所以它在 x+0 或 x*1 有用的意义上很有用 - 特定操作本身没有用,但这意味着您可以像处理任何其他值一样处理 0 和 1,而不必将它们视为一个特例。 (2认同)

Ser*_*nyy 127

自执行最后一个命令以来,目录的路径可能已更改,并且没有cd .bash 和 ksh93 外壳将依赖于问题中链接的帖子中描述的逻辑工作目录,因此调用cd .使外壳发出getcwd()系统调用将确保您当前路径仍然有效。

在 bash 中重现的步骤:

  1. 在终端选项卡问题中 mkdir ./dir_no_1; cd ./dir_no_1
  2. 在不同的终端选项卡问题中 mv dir_no_1 dir_no_2
  3. 在第一个终端选项卡问题echo $PWDpwd. 请注意,该目录已被外部重命名;shell 的环境还没有更新。
  4. 问题cd .; pwd; echo $PWD。请注意该值已更新。

但是ksh93并没有更新环境信息,所以cd .在ksh93中实际上可能没有用。在/bin/dashUbuntu 和其他基于 Debian 的系统上,cd .返回dash: 3: cd: can't cd to .错误,但cd -P .有效(与 ksh93 不同)。

  • 很高兴知道:我会将其添加到我的无用信息列表中。^^) (22认同)
  • @jayooin 很高兴我能为这份名单做出贡献;) (12认同)
  • 我认为你可以在 **same** 终端/bash 中执行 `mv ../dir_no_1 ../dir_no_2`。 (8认同)
  • @ctrl-alt-delor 确认,有效:) (3认同)

小智 55

另一个用例cd .是当您当前所在的目录已被删除然后再次创建时。考虑尝试以下 -

  1. 创建目录 temp
  2. cd temp 然后做一个 ls
  3. 打开另一个终端并删除然后重新创建该目录 temp
  4. 从第一个终端返回,尝试执行 ls。这将导致错误 -ls: cannot open directory .: Stale file handle
  5. cd . 然后做一个 ls 工作正常

  • 我经常使用它来测试远程部署。我所在的目录将被删除,然后通过一些自动化重新创建,我需要发出 `cd .` 以移动到具有相同名称的新目录。 (12认同)
  • 在这种情况下,我会执行“cd $PWD”。其他变体可能会起作用,但这个变体清楚地表达了意图:提取应该是我当前路径的内容(即读取`PWD`环境变量的内容),然后从根目录遍历文件系统层次结构,向下到恰好是可以通过该路径访问,无论它是否实际上是相同的目录。这完全符合此答案中的用例。 (5认同)
  • 这并不总是有效。例如,在破折号中,你会得到:`cd: can't cd to .` 现在我看了它,这已经在 Sergiy 的回答中提到了(移动,删除/重新创建 - 基本上相同:你的目录re in 不再是原始路径中的内容) (3认同)
  • 我真的很惊讶,甚至感到震惊,当目录被取消链接并在相同的文件系统路径上创建一个新的不同目录时,`cd .` 可以工作。当前工作目录已被取消链接,并且可能作为其中的一部分,它不再有“.”或“..”条目,即使有,“.”条目也应继续指向自身。看起来 shell 或内核正在根据目录路径名称执行 cd 命令,而不是简单地访问 `.` 条目。任何人都可以确认这种行为吗? (3认同)
  • 当我有一个 shell,它的当前工作目录是用 sshfs 挂载但 ssh 会话已关闭并重新打开时,我一直使用 `cd .`。 (2认同)
  • @通配符,啊。这取决于正在使用的外壳。例如`bash` 将`cd .` 翻译成`cd "$PWD"`,但并不是每个shell 都这样做。 (2认同)
  • @AdrianPronk 见上面 roaima 的评论。 (2认同)

mik*_*996 36

如果您不希望它指向任何“有趣”的地方,您可以$OLDPWD使用 quick清除cd .。它也会影响cd -.


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 .

  • 如果您已经在目录中,@CaptainMan 不会抛出错误(实际上)是空操作。`dirname` 命令在必要时生成 `.`,以避免破坏期望能够拆分路径的代码。 (2认同)

use*_*013 15

如果您必须使用损坏的 USB 电缆,这很常见。在设备断开连接并再次连接并自动挂载到同一目录后,您必须使用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 的回答中提到的行为。