Разница между $ HOME и ~

$HOME и ~ обычно ссылаются на одно и то же. То есть они являются путем к «домашнему» каталогу пользователя, который имеет общий вид »/home/userName".

Когда, если вообще, они не относятся к одному и тому же каталогу?

31
задан 30 September 2019 в 19:49

5 ответов

$HOME/, более вероятно, будет работать в стандартной Границе POSIX.2/bin/sh, поскольку расширение тильды является расширением, найденным в BSD csh tcsh удар GNU и другие.

, Если Вы хотите записать сценарии, портативные в busybox или тире или BSD sh, вложите капитал в дополнительные буквы, чтобы Вы не отказываете с ~/: Никакой такой файл или каталог в определенных системах.

я также нахожу $HOME/более читаемым.

1
ответ дан 23 October 2019 в 10:01

И $HOME и ~ точка к той же папке, домашней папке текущего пользователя, но оба - совсем другие вещи.

  • $HOME переменная среды , который установлен содержать домашнюю папку текущего пользователя.
  • ~ символ расширения оболочки , т.е. один из символов, который обрабатывается, прежде чем фактическая команда будет выполнена. ~ один расширяется до значения $HOME. ~nemo расширяется до корневого каталога пользователя nemo. Символ расширения оболочки является символом (или пара символов), который обрабатывается/интерпретируется оболочкой для создания фактической команды. Другой пример символа расширения оболочки *, который используется для расширения имен файлов.
45
ответ дан 23 October 2019 в 10:01

Одним путем они отличаются, находится в том, как оболочка Bash преобразовывает их при включении в " вид кавычек.

, Если Вы используете echo как это, без каких-либо кавычек, затем ~ и $HOME, имеют тот же эффект:

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

Однако с " кавычки вокруг них, результат отличается:

$ echo "~"
~
$ echo "$HOME"
/home/elias
17
ответ дан 23 October 2019 в 10:01

~ только расширяется как часть префикс тильды , который по определению должен запуститься в начале слова. Кроме того, поскольку это было, после того как часть globbing шаблонов, ~ не будет работать в двойных кавычках. Так, "~" или a~b приведет к литеральному значению ~ сохраняемый.

А, единственный ~ (или ~ сопровождаемый /), расширится до дома текущего пользователя:

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

А ~ сопровождаемый именем пользователя расширится для размещения папки того пользователя:

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

А ~ сопровождаемый + или - и дополнительное число расширится до элементов стопка каталога :

$ cd /etc
$ echo ~+0
/etc

$HOME эквивалент сингла ~, который вместо этого следует за синтаксическими правилами для переменных. Например, это разворачивает внутренние двойные кавычки, может быть сброшен, и , операнды обработки строк могут быть применены к нему.

13
ответ дан 23 October 2019 в 10:01

Это во многом зависит от того, что делает расширение. В ударе, ~ удобный способ получить корневой каталог, не инициировав расширение имени файла или разделение слова даже при том, что его неупомянутое. Например:

$ 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.

3
ответ дан 23 October 2019 в 10:01

Другие вопросы по тегам:

Похожие вопросы: