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
是有效的用户名)。