$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是没有的。