Bash命令
cd -
打印先前使用的目录并对其进行更改。
另一方面,Bash命令
cd ~-
直接更改为先前使用的目录,而不回显任何内容。
那是唯一的区别吗?每个命令的用例是什么?
Bash命令
cd -
打印先前使用的目录并对其进行更改。
另一方面,Bash命令
cd ~-
直接更改为先前使用的目录,而不回显任何内容。
那是唯一的区别吗?每个命令的用例是什么?
Answers:
这里有两件事在起作用。首先,-
单独将扩展到您以前的目录。在(强调我的)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"/* .
set -x
在执行之前打印扩展的命令可能会有助于说明两者之间的差异(或者,如果您一次不自己一次执行操作,可能只会产生难以理解的噪音)。
cd ~-/..
行之有效cd -/..
!
TL; DR:cd -
内置于cd
;~-
是的后续扩展~[name]
,并非特定于cd
。
POSIX.1-2008 Shell&Utilities定义cd -
了一种特殊情况,专门用于cd
命令:
当使用a
-
作为操作数时,它应等效于以下命令:
cd "$OLDPWD" && pwd
它将更改为上一个工作目录,然后输入其名称。
该~-
扩展名将在$OLDPWD
执行任何命令之前扩展为,并且可以作为任何命令的参数传递,而不仅仅是cd
。它是ksh和bash中的更高版本。
前面提到的POSIX.1-2008 Shell&Utilities标准还对Tilde Expansion进行了详细说明。该措词非常具体,以允许~-
在标准范围内作为未定义的行为,其中~[name]
指的是$HOME
if [name]
是空字符串,还是指用户的主目录(name
如果name
是有效的用户名)。
cd ~-
。