我一直关注的其中一篇教程简要指出cd .没有用。当尝试复制符号链接递归中OP显示的问题-是什么使其“重置”时,我还尝试了cd .,它显示出与OP描述相同的效果(增长$PWD变量),可以用cd -P抵消。

这让我想知道,是否有任何情况下实际上会使用cd .

评论

我有一个自定义.zshrc,当切换目录时,它将在目录上运行各种检查,例如,其中一项检查是在移动目录时自动激活/停用匹配的virtualenv。有时,我可能会启动新的shell或其他程序,而这些检查不会运行,并且我通常使用cd。触发检查,因为它简短而又简单。尽管我认为您打算将问题针对于原始环境。

除了($显而易见的)对$ PWD,cd的影响。还将$ OLDPWD更改为当前目录。我(目前)不知道为什么这可能有用,但出于完整性考虑……

我认为我从来不需要cd。,尽管看到下面的答案,我将来可能会使用,但是有时我会使用push。当我希望以后可以弹出该目录时。例如当运行一个用于配置,cd输出...和make的构建脚本时,完成后,我想回到原始目录。而不是维护我自己的不同于其他所有人期望的buildscript副本,我只是像pushed那样运行它。 ./BuildScriptName.sh; popd,这也使我有机会有时不弹出,然后稍后再弹出。

当然不要说“。”和'..'并不是在cd命令本身中实现的,因此没有人提出要实现该特定功能,这只是无用的事情的组合。

@ruakh不,外部程序不应影响shell执行环境。它主要用于POSIX合规性,它要求某些实用程序在Shell外部存在,并评估外部命令的退出状态。您可以在此处了解有关/ bin / cd的用途unix.stackexchange.com/q/50058/85039

#1 楼

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

评论


同意。应该被视为由cd语法指定的有效路径就可以了。

– Sergiy Kolodyazhnyy
19年1月22日在4:52

您可以添加以下示例:循环,如IFS = read Dir; cd“ $ Dir”;做点什么;完成<<(找到。-d型)。在其过程中,查找农产品。作为路径,因此命令cd“ $ Dir”扩展为cd ..因此,在脚本中,它非常有用。

– rexkogitans
19年1月22日在9:43

例如,一个脚本实际上运行cd $ {path_to_directory},但是在某个时候它证明该目录是当前目录,而path_to_directory =。所以你需要cd。以防万一。

– Demis
19年1月23日在7:46

换句话说,它的实用性是因为它不需要额外的代码(如果检查和else子句,任何特殊的大小写)。

– jpmc26
19年1月24日,18:27



因此,从x + 0或x * 1有用的意义上讲,这很有用-特定的操作本身并不有用,但这意味着您可以将0和1与其他任何值一样处理,而不必将它们视为特例。

–user32929
19年1月27日在23:29

#2 楼

自上一条命令执行以来,目录的路径可能已更改,并且在没有cd .的情况下,bash和ksh93 shell将依赖于该问题链接中所描述的帖子中描述的逻辑工作目录,因此调用cd .,这使外壳程序发出getcwd() syscall将确保您当前的路径仍然有效。

以bash复制的步骤:


在终端选项卡中,发出mkdir ./dir_no_1; cd ./dir_no_1

在另一个终端选项卡问题mv dir_no_1 dir_no_2

在第一个终端选项卡问题echo $PWDpwd中。注意,该目录已在外部重命名;外壳环境尚未更新。
问题cd .; pwd; echo $PWD。注意该值已更新。
但是,ksh93不会更新环境信息,因此ksh93中的cd .实际上可能没有用。在Ubuntu和其他基于Debian的系统上的/bin/dash中,cd .返回dash: 3: cd: can't cd to .错误,但是cd -P .可以工作(与ksh93不同)。

评论


提提您:我会将其添加到我的无用信息列表中。 ^^)

– Jayooin
19年1月22日在6:39

@jayooin很高兴我可以为您提供帮助;)

– Sergiy Kolodyazhnyy
19年1月22日在7:53

我认为您可以在同一终端/ bash中执行mv ../dir_no_1 ../dir_no_2。

–ctrl-alt-delor
19年1月22日在9:00

@ ctrl-alt-delor确认,有效:)

– Sergiy Kolodyazhnyy
19年1月22日在9:12

@ymbirtt在大多数shell中,pwd实际上是内置的,但是调用/ bin / pwd对shell环境没有影响-外部实用程序通常不会影响shell环境。 / bin / cd和/ bin / pwd之所以存在,是出于POSIX一致性的原因。关于外部cd有一​​个很好的讨论,其中一些可能也适用于/ bin / pwd

– Sergiy Kolodyazhnyy
19年1月22日在9:52

#3 楼

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


创建目录temp


cd temp,然后执行ls

打开另一个终端并删除然后重新创建该目录temp

从第一个终端返回,尝试执行ls。这将导致错误-ls: cannot open directory .: Stale file handle


cd .然后执行ls可以正常工作


评论


这并不总是有效。例如,在破折号中,您将获得:cd:不能cd到。现在,我已经看过了,这已在Sergiy的答案中提到(移动,删除/重新创建-本质上是相同的:您所在的目录不再是原始路径中的目录)

– Olorin
19年1月22日在7:16



我经常用它来测试远程部署。我所在的目录将被删除,然后通过某种自动化方式重新创建,我需要发出cd。移到具有相同名称的新目录。

– HP Williams
19年1月22日在10:22

我用cd。一直有一个shell,其shell当前工作目录已通过sshfs挂载,但ssh会话已关闭并重新打开。

–詹姆士林
19年1月22日在21:52

在这种情况下,我会执行“ cd $ PWD”。其他变体也可能起作用,但是该变体明确表达了其意图:提取应该是我当前路径的内容(即读取PWD环境变量的内容),然后从根目录遍历文件系统层次结构,直至碰巧可以访问的目录。通过该路径,实际上是否是同一目录。这恰好适合此答案中的用例。

–StéphaneGourichon
19年1月23日在14:32

那个CD我真的很惊讶,甚至感到震惊。当目录已取消链接并且在同一文件系统路径上创建了一个新的不同目录时,该文件将起作用。当前工作目录已取消链接,大概是其中的一部分,它不再具有。或..条目,即使这样做也是如此。条目应继续指向自身。看起来Shell或内核正在根据目录路径名而不是简单地访问cd来执行cd命令。条目。有人可以确认这种行为吗?

– Adrian Pronk
19年1月25日在9:45

#4 楼

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

#5 楼

从编程上讲,它是无操作的有用。考虑从外部输入提供的路径。

read -p "Path to file: " p
dirn=$(dirname "$p")
file=$(basename "$p")
echo "dirn=$dirn, file=$file"
cd "$dirn"
ls -ld "$file"


使用诸如“ fred.txt”之类的路径,目录将变为.,从而导致cd .

评论


如果您已经在要导航的目录中,那么它不会引发错误是很有用的,但是我不会说它作为无操作者很有用。

–曼上尉
19年1月22日在14:05

如果您已经在目录中,则@CaptainMan不会抛出错误(有效)是无操作。 dirname命令生成。在必要时避免破坏期望能够拆分路径的代码。

–roaima
19年1月22日在16:16



#6 楼

如果必须使用不良的USB电缆,这很常见。设备断开连接并再次连接并自动挂载到同一目录后,必须使用cd .使其重新工作。

评论


这是否取决于哪种设备,如何访问,文件系统,操作系统以及&c?

–gidds
19年1月24日在10:09

操作系统,也许吧。只要内核可以在使用文件系统时找到卸载方法,文件系统就不太可能相关。在任何情况下,该命令都会在完全正确的情况下使用。

–user23013
19年1月24日在10:39

#7 楼

注意 ”。”是将打开的文件的名称指定为任何进程(当然包括shell进程)的当前工作目录的正确方法,以及“”。在任何目录(包括当前工作目录)中,始终是文件的有效名称。如果已删除基础的当前工作目录(或“坏”,例如,陈旧的NFS句柄),则名称.可能不是给定流程实例的文件的有效名称,但它是有效的确保在每个有效目录中都存在文件的名称。

因此,对于任何接受目录名称的命令,.必须是有效参数,因此在标准外壳程序中cd .必须为有效命令。

cd .是否有用取决于外壳程序的实现。如前所述,如果shell在调用基础chdir系统调用后重置其对当前工作目录的完整路径名的内部想法,这可能很有用,例如说基础目录(或其某些父目录)是否已重命名。 />
我知道至少有一些shell(在FreeBSD和NetBSD上为/bin/sh)会将cd ""转换为cd .,可以说可以描述为支持在脚本中以编程方式使用变量(可以将变量用作参数)的功能(例如,将空变量替换转换为“不执行任何操作”结果),尽管FreeBSD提交历史记录指出,更改直接是由于添加了POSIX支持以防止chdir("")失败,而POSIX任务必须失败。

其他一些shell将使用存储为当前工作目录的标准路径名的内容替换.,因此对于他们来说,这可能允许Sahil Agarwal的答案中提到的行为。 />

#8 楼

就在今天,当我在最初在同一分支上创建的目录中重新建立我在Git中工作的分支的基础时,才使用此命令。重新设置正常,但随后,git status抛出错误。 cd .之后一切正常。

(顺便说一下,我在Windows上的MobaXterm中工作。以防万一,您试图重现此代码。在其他系统上可能不会发生。)


我还用了自动处理程序刷新的目录中的该命令,该过程将旧目录移开并用新目录替换(因此,它尽可能接近于原子目录)。 cd .并不是很常见的情况,但恰恰是需要的。


在阅读完Stephane Chazelas的出色回答后:


https:// unix。 stackexchange.com/a/79621/135943

我现在了解到,上述用例仅适用于我使用bash的情况,其中cd .等同于cd "$PWD"。我强烈建议您阅读链接的答案。

#9 楼

我使用cd .通过cd函数重新运行已经超载了bash的内容。

来自我的~/.bashrc

# from the "xttitle(1)" man page - put info in window title
update_title()
{
    [[ $TERM = xterm ]] || [[ $TERM = xterm-color ]]  && xttitle "[$$] ${USER}@${HOSTNAME}:$PWD"
}

cd()
{
    [[ -z "$*" ]] && builtin cd $HOME
    [[ -n "$*" ]] && builtin cd "$*"
    update_title
}


#10 楼

编辑:这已经由Sahil以前建议过。

如果您位于一个已被另一个进程删除并重新创建的文件夹中,这将非常有用。例如,假设有两个终端会话

 mkdir d
 cd d
 touch f

 rm -rf /path/to/d # delete the folder where  is in ...
 mkdir /path/to/d # ... and recreate it

 touch g # cannot create file g because current dir doesn't exist anymore
touch: cannot touch ‘g’: Stale file handle
 cd . # go to the newly created dir (same path)
 touch g # works fine now


我不确定(OS,SHELL,...?)的根源到底在哪里这种行为是。

评论


其他答案已经提到了这一点。

– Kusalananda♦
19年1月29日在10:04