$HOMEи ~обычно ссылаются на одно и то же. То есть они представляют собой путь к «домашнему» каталогу пользователя, который имеет общую форму «/ home / userName».
Когда, если вообще, они не относятся к одному и тому же каталогу?
$HOMEи ~обычно ссылаются на одно и то же. То есть они представляют собой путь к «домашнему» каталогу пользователя, который имеет общую форму «/ home / userName».
Когда, если вообще, они не относятся к одному и тому же каталогу?
Ответы:
И то, $HOMEи другое ~указывает на одну и ту же папку, домашнюю папку текущего пользователя, но оба они очень разные.
$HOMEявляется переменной среды , которая устанавливается , чтобы содержать домашнюю папку текущего пользователя.~является символом расширения оболочки , т. е. одним из символов, который обрабатывается перед выполнением фактической команды. ~само по себе расширяется до значения $ HOME. ~nemoрасширяется до домашнего каталога пользователя nemo. Символ расширения оболочки - это символ (или пара символов), который обрабатывается / интерпретируется оболочкой для создания фактической команды. Другой пример символа расширения оболочки - *это расширение имен файлов.~расширяется до $ HOME или% APPDATA% в Windows. Если они не определены, он будет искать путь в «базе паролей» (что обычно означает /etc/passwd, но может быть LDAP или какой-либо другой источник данных). Около 20 лет назад вы могли быть предупреждены, что $ HOME может быть не установлен на некоторых машинах, хотя ~гарантированно расширится до чего-то.
~расширяется до $HOME(равно $HOMEPATH), а не $APPDATA. И на cmd.exe, ~не расширяется.
HOME- это переменная окружения (концепция ОС, например , в оболочках sh, установленная с помощью exportили declare -x), а не переменная оболочки (определение которой полностью зависит от оболочки, но в оболочках sh она обычно устанавливается с foo=valueили с setили в нескольких других пути).
Один из их отличий заключается в том, как оболочка Bash преобразует их в "кавычках.
Если вы используете echoтак без кавычек, то ~и $HOMEполучите тот же эффект:
$ echo ~
/home/elias
$ echo $HOME
/home/elias
Однако с "кавычками вокруг них результат отличается:
$ echo "~"
~
$ echo "$HOME"
/home/elias
~расширяется только как часть префикса тильды, который по определению должен начинаться с начала слова. Кроме того, поскольку это когда-то было частью глобальных шаблонов, оно ~не будет работать внутри двойных кавычек. Таким образом, "~"или a~bприведет к буквальному значению ~сохранения.
Один ~(или ~сопровождаемый /) расширится до дома текущего пользователя:
$ echo ~/.ssh
/home/user/.ssh
За ~ним следует имя пользователя, которое развернется в домашнюю папку этого пользователя:
$ echo ~root/.ssh
/root/.ssh
За ~ним следует a +или a -и необязательный номер, который расширится до элементов стека каталогов :
$ cd /etc
$ echo ~+0
/etc
$HOMEэквивалент одного ~, который вместо этого следует правилам синтаксиса для переменных. Например, он раскрывается внутри двойных кавычек, может быть не установлен, и к нему могут применяться операнды манипуляции со строками .
Это во многом зависит от того, что делает расширение. В 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и ~не ссылаться на одну и ту же вещь - они обычно делают по умолчанию - и затем вы сознательно назначаете переменную среды, чтобы они не ссылались на одну и ту же вещь. Это хорошая демонстрация, но излишне запутанная.
$ HOME / более вероятно будет работать в стандартном POSIX.2 Bourne / bin / sh, поскольку расширение тильды является расширением, найденным в BSD csh tcsh GNU bash и других.
Если вы хотите написать сценарии, переносимые на busybox или dash или BSD sh, инвестируйте в дополнительные буквы, чтобы не потерпеть крах с ~ /: в некоторых системах такой файл или каталог отсутствуют.
Я также нахожу $ HOME / более читабельным.
$HOMEи используются редко ~. Моя бывшая личность, вероятно, знала это.
~зависит от оболочки, а $ HOME - нет.