“ cd-”和“ cd〜-”之间的区别


56

Bash命令

cd - 

打印先前使用的目录并对其进行更改。

另一方面,Bash命令

cd ~-

直接更改为先前使用的目录,而不回显任何内容。

那是唯一的区别吗?每个命令的用例是什么?


3
我建议您不要使用任何棘手的东西。这是你的大脑cd ~-
DepressedDaniel

10
@DepressedDaniel,即使您不打算使用棘手的东西,了解幕后的情况仍然很有用-理解极端情况可以在以后尝试调试其他内容时让您摆脱困境。
anotherdave

Answers:


81

这里有两件事在起作用。首先,-单独将扩展到您以前的目录。在(强调我的)cd部分中对此进行了解释man bash

-尝试更改目录之前,将参数转换为$ OLDPWD。 如果使用CDPATH中的非空目录名称,或者使用-第一个参数,并且目录更改成功,则将新工作目录的绝对路径名写入标准输出。 如果目录已成功更改,则返回值为true;否则为false。否则为假。

因此,简单的操作cd -会将您带回到上一个目录,并打印出目录名称。另一个命令记录在“波浪扩展”部分:

如果tilde-prefix是a ~+,则shell变量PWD的值将替换tilde-prefix。如果tilde-prefix是a ~-,则替换外壳变量OLDPWD的值(如果已设置)。如果波浪号前缀中波浪号后面的字符由数字N组成,并可选地以a +或a -为前缀,则波浪号前缀将替换为目录堆栈中的相应元素,因为它将由调用的内置dirs显示波浪号前缀作为参数。如果波浪号前缀中波浪号后的字符由不带前导+或的数字组成-+则假定为。

使用示例可能更容易理解:

$ pwd
/home/terdon
$ cd ~/foo
$ pwd
/home/terdon/foo
$ cd /etc
$ pwd
/etc
$ echo ~        ## prints $HOME
/home/terdon
$ echo ~+       ## prints $PWD
/etc
$ echo ~-       ## prints $OLDPWD
/home/terdon/foo

因此,在一般情况下,-意思是“以前的目录”。这就是为什么cd -它本身会将您带回到您所处的位置。

主要区别在于cd -特定于cd内置功能。如果尝试这样做echo -,将只打印一个-。的~-是的波浪线扩展功能的一部分并且表现得类似于一个变量。因此,您echo ~-可以获得有意义的东西。您也可以在其中使用它,cd ~-但也可以在其他任何命令中使用它。例如cp ~-/* .,这相当于cp "$OLDPWD"/* .


1
set -x在执行之前打印扩展的命令可能会有助于说明两者之间的差异(或者,如果您一次不自己一次执行操作,可能只会产生难以理解的噪音)。
彼得·科德斯

1
今天我学会了@terdon。
sitilge

简而言之…… cd ~-/..行之有效cd -/..
Ray Foss

13

~-受波浪符号扩展的影响(请参阅man bash),因此cd直接看到的是先前的目录名称。-不会被外壳扩展,cd可以直接看到它,并且行为如文档所述:

参数-等效于$ OLDPWD。如果使用CDPATH中的非空目录名称,或者第一个参数是-,并且目录更改成功,则将新工作目录的绝对路径名写入标准输出。


4

TL; DR:cd -内置于cd~-是的后续扩展~[name],并非特定于cd

POSIX.1-2008 Shell&Utilities定义cd -了一种特殊情况,专门用于cd命令

当使用a -作为操作数时,它应等效于以下命令:

cd "$OLDPWD" && pwd

它将更改为上一个工作目录,然后输入其名称。

~-扩展名将在$OLDPWD执行任何命令之前扩展为,并且可以作为任何命令的参数传递,而不仅仅是cd。它是的更高版本。

前面提到的POSIX.1-2008 Shell&Utilities标准还对Tilde Expansion进行了详细说明。该措词非常具体,以允许~-在标准范围内作为未定义的行为,其中~[name]指的是$HOMEif [name]是空字符串,还是指用户的主目录(name如果name是有效的用户名)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.