这些(几乎相同的)目录命令之间有什么区别吗?
1. cd
2. cd ~
3. cd ~/
我在我的 shell 中尝试过,它们都指向主目录。是否存在它们不同的可能情况?
答案1
POSIX 定义...
...如果
cd
没有给出任何参数,它将使用变量的值$HOME
(如果变量已设置),否则不执行任何操作(尽管它还表示结果未指定)。—cd
...如果参数是
~
或以 开头~/
,则波浪号将扩展为 的值($HOME
如果变量已设置);否则结果未指定。—tilde expansion
所以如果$HOME
设置了,那么所有三个命令都是等效的。(目录名后的多余斜杠没有意义。)
然而,$HOME
如果不是~
集合,则-expansion 和的结果cd
都是未指定:
在狂欢、美国电话电报公司什和传家宝什,
cd
将会失败并显示“没有主目录”。在韓軟體,嘚,短跑和 MirBSD韓國,根本
cd
就什么也不做。在tcsh,plain
cd
将使用 查找主目录getpwuid()
。
至于~
扩展...
狂欢和tcsh将从扩展
~
到主目录getpwnam()
。美国电话电报公司什将扩展
~
为您的用户名(?!)。在韓軟體和嘚,
~
将扩展为一个空字符串。 (cd ~
因此在这些 shell 中,将不执行任何操作,就像普通的一样cd
。)在短跑和 MirBSD韓國,
~
将保留文字~
。(使用cd ~
将尝试更改为名为这样的目录。)传家宝什
~
即使设置了也不会扩展$HOME
——它可能早于惯例。
其中,只有韓軟體和嘚坚持 POSIX 定义,即使它是空的,也要扩展~
为的值。$HOME
(这鱼如果变量为空,shell 总是$HOME
在启动时设置,并且随后拒绝修改它。)getpwnam()
答案2
好吧,我可以想象 1 与 2 和 3 不同的场景。尝试在 bash 中定义以下函数:
cd () { if (($#)) ; then builtin cd "$1" ; else cd / ; fi ; }
- 将带您前往
/
,而 2. 和 3. 将带您回家。