$HOME 和 ~ 的区别

H2O*_*aCl 33 home-directory

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

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

van*_*ium 47

双方$HOME~指向同一个文件夹,当前用户的主文件夹,但两者有很大的不同的东西。

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

  • @MirekDługosz 至少在 Windows 上的 *git bash* 上,`~` 扩展为 `$HOME`(等于 `$HOMEPATH`),而不是 `$APPDATA`。而在 cmd.exe 上,`~` 不会展开。 (3认同)

Eli*_*ias 18

它们的不同之处在于 Bash shell 在用"引号括起来时如何转换它们。

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

$ echo ~
/home/elias
$ echo $HOME
/home/elias
Run Code Online (Sandbox Code Playgroud)

但是,"在它们周围加上引号,结果会有所不同:

$ echo "~"
~
$ echo "$HOME"
/home/elias
Run Code Online (Sandbox Code Playgroud)


Dmi*_*yev 13

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

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

$ echo ~/.ssh
/home/user/.ssh
Run Code Online (Sandbox Code Playgroud)

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

$ echo ~root/.ssh
/root/.ssh
Run Code Online (Sandbox Code Playgroud)

A~后跟 a+或 a-和可选数字将扩展为目录堆栈的元素:

$ cd /etc
$ echo ~+0
/etc
Run Code Online (Sandbox Code Playgroud)

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