$HOME
和~
通常所说的同样的事情。也就是说,它们是“用户的主目录”目录的路径,该目录的格式通常为“ / home / userName”。
什么时候(如果有的话)它们不指向同一目录?
$HOME
和~
通常所说的同样的事情。也就是说,它们是“用户的主目录”目录的路径,该目录的格式通常为“ / home / userName”。
什么时候(如果有的话)它们不指向同一目录?
Answers:
双方$HOME
并~
指向同一个文件夹,当前用户的主文件夹,但两者有很大的不同的东西。
$HOME
是一个环境变量,设置为包含当前用户的主文件夹。~
是外壳扩展符号,即在执行实际命令之前已处理的符号之一。~
单独扩展为$ HOME的值。~nemo
扩展到user的主目录nemo
。Shell扩展符号是由Shell处理/解释以构建实际命令的一个字符(或一对字符)。Shell扩展符号的另一个示例是*
,用于扩展文件名。~
在Windows上扩展为$ HOME或%APPDATA%。如果未定义它们,它将在“密码数据库”(通常表示/etc/passwd
,但可能是LDAP或某些其他数据源)中查找路径。大约20年前,您可能已经警告过,某些机器上可能未设置$ HOME,但可以~
保证将其扩展为某些内容。
~
扩展为$HOME
(等于$HOMEPATH
),而不是$APPDATA
。并且在cmd.exe ~
上不会扩展。
HOME
是环境变量(一种操作系统概念,例如在sh shell中使用export
或设置declare -x
),而不是shell变量(其定义完全取决于shell,但在sh shell中通常使用foo=value
或with set
或其他设置方法)。
~
仅扩展为波浪号前缀的一部分,根据定义,波浪号前缀必须从单词的开头开始。此外,由于它曾经是遍历模式的一部分,~
因此无法在双引号内使用。因此,"~"
或a~b
将导致字面值~
被保留。
单个~
(或~
后跟一个/
)将扩展到当前用户的家:
$ echo ~/.ssh
/home/user/.ssh
一个~
接着一个的用户名将会扩大到该用户的主文件夹:
$ echo ~root/.ssh
/root/.ssh
甲~
后跟一个+
或一个-
和可选的数目将扩大到的元素目录堆栈:
$ cd /etc
$ echo ~+0
/etc
$HOME
是single的等效项~
,它遵循变量的语法规则。例如,它在双引号内展开,可以不设置,并且可以对其应用字符串操作操作数。
这很大程度上取决于扩展的内容。在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
,并~
没有涉及到同样的事情-他们通常在默认情况下做的-然后你刻意分配给环境变量,使它们不是指同样的事情。这是一个很好的演示,但不必要地造成混淆。
~
由Shell决定,而$ HOME是没有的。