几乎相同目录命令之间的区别

几乎相同目录命令之间的区别

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

1. cd
2. cd ~
3. cd ~/

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

答案1

POSIX 定义...

  1. ...如果cd没有给出任何参数,它将使用变量的值$HOME(如果变量已设置),否则不执行任何操作(尽管它表示结果未指定)。—cd

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

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


然而,$HOME如果不是~集合,则-expansion 和的结果cd都是未指定

  • 狂欢、美国电话电报公司和传家宝cd将会失败并显示“没有主目录”。

  • 韓軟體短跑和 MirBSD韓國,根本cd就什么也不做。

  • tcsh,plaincd将使用 查找主目录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 ; }
  1. 将带您前往/,而 2. 和 3. 将带您回家。

相关内容