几乎相同目录命令的区别

Bel*_*day 2 linux bash shell

这些(几乎相同)目录命令之间有什么区别吗?

1. cd
2. cd ~
3. cd ~/
Run Code Online (Sandbox Code Playgroud)

我在我的 shell 中尝试过,它们都指向主目录。是否有任何可能的情况,它们是不同的?

use*_*686 9

POSIX 定义...

  1. ...ifcd没有给出任何参数,它将使用$HOMEif 变量设置的值,否则不做任何事情(尽管它说结果未指定)。—cd

  2. ...如果参数是~或以 开头~/,则波浪号将扩展$HOME为设置变量时的值;否则结果未指定。—tilde expansion

所以如果$HOME设置了,那么所有三个命令都是等价的。(目录名后的额外斜线是没有意义的。)


但是,如果$HOME没有设置,则两者的结果~-expansion并cd不明

  • bash、 AT&T ksh和 Heirloom sh 中,plaincd将因“没有主目录”而失败。

  • cshzshdash和 MirBSD mksh 中,plaincd什么也不做。

  • tcsh 中,plaincd将使用getpwuid().

至于~扩展...

  • 庆典tcsh的将扩大~到从主目录getpwnam()

  • AT&T ksh将扩展~为您的用户名 (?!)。

  • cshzsh 中~将扩展为空字符串。(cd ~因此cd,在这些 shell 中,什么都不做,就像 plain 一样。)

  • dash和 MirBSD mksh 中~仍然是文字~. (使用cd ~将尝试更改为名为此类的目录。)

  • 即使设置了传家宝sh也永远不会扩展- 它可能早于约定。~$HOME

其中,只有cshzsh坚持 POSIX 定义~$HOME即使它是空的也扩展到值。

(该壳总是套$HOMEgetpwnam()启动时如果变量清空,并拒绝之后对其进行修改。)

  • 我已经安装了shell,所以...... (3认同)