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]指的是$HOMEif [name]是空字符串,还是指用户的主目录(name如果name是有效的用户名)。
cd ~-。