这些(几乎相同)目录命令之间有什么区别吗?
1. cd
2. cd ~
3. cd ~/
Run Code Online (Sandbox Code Playgroud)
我在我的 shell 中尝试过,它们都指向主目录。是否有任何可能的情况,它们是不同的?
POSIX 定义...
...ifcd没有给出任何参数,它将使用$HOMEif 变量设置的值,否则不做任何事情(尽管它也说结果未指定)。—cd
...如果参数是~或以 开头~/,则波浪号将扩展$HOME为设置变量时的值;否则结果未指定。—tilde expansion
所以如果$HOME设置了,那么所有三个命令都是等价的。(目录名后的额外斜线是没有意义的。)
但是,如果$HOME是没有设置,则两者的结果~-expansion并cd有不明:
在bash、 AT&T ksh和 Heirloom sh 中,plaincd将因“没有主目录”而失败。
在csh、zsh、dash和 MirBSD mksh 中,plaincd什么也不做。
在tcsh 中,plaincd将使用getpwuid().
至于~扩展...
庆典和tcsh的将扩大~到从主目录getpwnam()。
AT&T ksh将扩展~为您的用户名 (?!)。
在csh和zsh 中,~将扩展为空字符串。(cd ~因此cd,在这些 shell 中,什么都不做,就像 plain 一样。)
在dash和 MirBSD mksh 中,~仍然是文字~. (使用cd ~将尝试更改为名为此类的目录。)
即使设置了传家宝sh也永远不会扩展- 它可能早于约定。~$HOME
其中,只有csh和zsh坚持 POSIX 定义~,$HOME即使它是空的也扩展到值。
(该鱼壳总是套$HOME从getpwnam()启动时如果变量清空,并拒绝之后对其进行修改。)