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

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

bash 命令

cd - 

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

另一方面,Bash 命令

cd ~-

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

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

答案1

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

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

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

如果波浪号前缀是 a ~+,则 shell 变量 PWD 的值将替换波浪号前缀。如果波形符前缀为 a ~-,则将替换 shell 变量 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"/* .

答案2

~-受波形符扩展影响(参见 man bash),所以cd看到的就是直接之前的目录名。-不被 shell 扩展,cd直接看到它,并且行为如文档所示:

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

答案3

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

POSIX.1-2008 壳牌与公用事业定义cd -为一种特殊情况,即具体的为了cd命令

当 a-用作操作数时,这相当于命令:

cd "$OLDPWD" && pwd

它会更改为之前的工作目录,然后写入其名称。

扩展~-名将扩展到$OLDPWD任何命令执行之前,并且可以作为任何命令的参数传递,而不仅仅是cd.这是后来的扩展

上述 POSIX.1-2008 Shell & Utilities 标准也有波浪号扩展的详细解释。该措辞非常具体,以允许~-标准范围内的未定义行为,其中~[name]指的$HOME[name]空字符串,或用户的主目录name(如果name是有效的用户名)。

相关内容