$ HOME和〜之间的区别


Answers:


45

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

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

1
~在Windows上扩展为$ HOME或%APPDATA%。如果未定义它们,它将在“密码数据库”(通常表示/etc/passwd,但可能是LDAP或某些其他数据源)中查找路径。大约20年前,您可能已经警告过,某些机器上可能未设置$ HOME,但可以~保证将其扩展为某些内容。
MirekDługosz

这种差异在诸如make之类的程序中很明显,当您需要知道需要使用两者中的哪一个时
D. Ben Knoble

3
@MirekDługosz至少在Windows 上的git bash上,~扩展为$HOME(等于$HOMEPATH),而不是$APPDATA。并且在cmd.exe ~上不会扩展。
海德

1
@vanadium HOME是环境变量(一种操作系统概念,例如在sh shell中使用export或设置declare -x),而不是shell变量(其定义完全取决于shell,但在sh shell中通常使用foo=value或with set或其他设置方法)。
海德

1
@hyde我说错了。bash将检查$ HOME,如果未设置,它将检查%APPDATA%,但仅在Windows上;如果未设置,它将查找“密码数据库”。见git.savannah.gnu.org/cgit/bash.git/tree/lib/readline/...
米雷克Długosz

17

它们不同的一种方式是,当Bash shell "用引号引起来时如何转换它们。

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

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

但是,使用"引号引起来的结果有所不同:

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

13

~仅扩展为波浪号前缀的一部分,根据定义,波浪号前缀必须从单词的开头开始。此外,由于它曾经是遍历模式的一部分,~因此无法在双引号内使用。因此,"~"a~b将导致字面值~被保留。

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

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

一个~接着一个的用户名将会扩大到该用户的主文件夹:

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

~后跟一个+或一个-和可选的数目将扩大到的元素目录堆栈

$ cd /etc
$ echo ~+0
/etc

$HOME是single的等效项~,它遵循变量的语法规则。例如,它在双引号内展开,可以不设置,并且可以对其应用字符串操作操作数


3

这很大程度上取决于扩展的内容。在bash中,这~是一种获取主目录的便捷方法,即使它没有被引用,也不会触发文件名扩展或单词拆分。例如:

$ HOME='/*'
$ echo $HOME
/bin /boot /dev /etc /home /lib /lib64 /media /mnt /opt /proc /root /run /sbin /srv /sys /tmp /usr /var
$ echo ~
/*

要么:

$ HOME='/ a b'
$ printf "|%s|\n" $HOME ~
|/|
|a|
|b|
|/ a b|

因此,如果由于某种原因(例如在这种情况下,您应该重新思考整件事,那么对猪进行搏斗就更容易了),您~可能会更方便。


在其他地方,在Python,例如,~$HOME具有由被扩展不同 的功能。其他一些地方允许变量,而不允许使用其他外壳程序语法,例如通配符或代字号扩展(例如~/.pam_environment,,它具有用于变量扩展的特殊语法)。还有其他地方允许将波浪号扩展作为例外(例如systemd),但是直接查询passwd数据库而不是使用$HOME


您在此处显示但没有提及的另一个大不同是,您可以更改的值$HOME,但不能(直接)更改的值~

于是我问什么时候$HOME,并~没有涉及到同样的事情-他们通常在默认情况下做的-然后你刻意分配给环境变量,使它们不是指同样的事情。这是一个很好的演示,但不必要地造成混淆。
H2ONaCl

1

$ HOME /更可能在标准POSIX.2 Bourne / bin / sh中使用,因为波浪号扩展名是BSD csh tcsh GNU bash等中的扩展名。

如果要编写可移植到busybox或破折号或BSD sh的脚本,请投资额外的字母,以免〜/导致崩溃:在某些系统上没有此类文件或目录。

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


在脚本中,可读性和可见性很重要。也许这就是为什么我的脚本$HOME很少使用的原因~。我以前的自我可能知道这一点。
H2ONaCl
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.