$HOME 和 ~ 之间的区别

$HOME 和 ~ 之间的区别

$HOME并且~通常指代同一件事。也就是说,它们是“用户主”目录的路径,其一般形式为“/home/userName”。

什么时候,如果有的话,这些不是指同一个目录?

答案1

两者$HOME~指向同一个文件夹,即当前用户的主文件夹,但两者是非常不同的东西。

  • $HOME是一个环境变量,设置为包含当前用户的主文件夹。
  • ~壳层展开符号,即在执行实际命令之前处理的符号之一。~单独扩展为 $HOME 的值。~nemo扩展为用户 的主目录nemo。shell 扩展符号是 shell 处理/解释以构建实际命令的字符(或字符对)。shell 扩展符号的另一个示例是*,它用于扩展文件名。

答案2

它们之间的一个区别在于当它们被"引号括起来时,Bash shell 如何进行转换。

echo如果像这样使用,不带任何引号,~$HOME具有相同的效果:

$ echo ~
/home/elias
$ echo $HOME
/home/elias

然而,如果用"引号引起来,结果就不同了:

$ echo "~"
~
$ echo "$HOME"
/home/elias

答案3

~仅作为波浪号前缀根据定义,它必须从单词的开头开始。此外,由于它曾经是通配符模式的一部分,因此~在双引号内不起作用。因此,"~"a~b将导致~保留文字值。

单个~(或~后跟/)将扩展到当前用户的主页:

$ echo ~/.ssh
/home/user/.ssh

后跟~用户名将扩展至该用户的主文件夹:

$ echo ~root/.ssh
/root/.ssh

A~后跟 a+或 a-和一个可选数字将扩展为目录堆栈

$ cd /etc
$ echo ~+0
/etc

$HOME相当于单个~,但它遵循变量的语法规则。例如,它在双引号内展开,可以取消设置,并且字符串操作操作数可以应用于它。

答案4

$HOME/ 更有可能在标准 POSIX.2 Bourne /bin/sh 中工作,因为波浪号扩展是 BSD csh tcsh GNU bash 和其他系统中的扩展。

如果您想编写可移植到 busybox 或 dash 或 BSD sh 的脚本,请投资额外的字母,以免在某些系统上因 ~/: No such file or directory 而崩溃。

我还发现 $HOME/ 更具可读性。

相关内容