Різниця між $ HOME та ~


31

$HOMEі ~зазвичай посилаються на те саме. Тобто вони є шляхом до каталогу "домашня сторінка користувача", який має загальну форму "/ home / userName".

Коли вони взагалі не звертаються до одного каталогу?


11
В ~є оболонка залежить в той час як $ HOME немає.
Kulfy

Відповіді:


45

Обидва $HOMEі ~вказують на одну і ту ж папку, домашню папку поточного користувача, але обидві речі дуже різні.

  • $HOMEце змінна середовище , яка встановлена ​​таким, що містить домашню папку поточного користувача.
  • ~є символом розширення оболонки , тобто одним із символів, який обробляється до виконання фактичної команди. ~поодинці розширюється до значення $ HOME. ~nemoрозширюється на домашній каталог користувача nemo. Символ розширення оболонки - це символ (або пара символів), який обробляється / інтерпретується оболонкою для побудови фактичної команди. Ще один приклад символу розширення оболонки - *це розширення імен файлів.

1
~розширюється до $ HOME або% APPDATA% у Windows. Якщо вони не визначені, він шукатиме шлях у "базі даних паролів" (що зазвичай означає /etc/passwd, але це може бути LDAP або якесь інше джерело даних). Дещо 20 років тому вас могли попередити, що $ HOME може не встановлюватися на деяких машинах, тоді ~як гарантовано розшириться на щось.
Mirek Długosz

Ця різниця помітна в таких програмах, як make, коли вам потрібно знати, яке з двох вам потрібно
D. Ben Knoble,

3
@ MirekDługosz Принаймні на git bash у Windows, ~розширюється на $HOME(рівне $HOMEPATH), не $APPDATA. А на cmd.exe ~не розширюється.
Гайда

1
@vanadium HOME- це змінна середовище (концепція ОС, наприклад, в оболонках sh, встановлена ​​з exportабо declare -x), а не змінна оболонка (визначення якої повністю залежить від оболонки, але в оболонках sh вона зазвичай встановлюється з foo=valueабо з setкількома іншими способи).
Гайд

1
@hyde Я неправильно сформулював це. bash перевірить $ HOME, якщо він не встановлений, він перевірить% APPDATA%, але лише у Windows; якщо він не встановлений, він буде шукати "базу даних паролів". Дивіться git.savannah.gnu.org/cgit/bash.git/tree/lib/readline/…
Mirek Długosz

17

Один із способів їх розходження полягає в тому, як оболонка Bash перетворює їх, коли вони укладені у "вигляді лапок.

Якщо ви використовуєте 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є еквівалентом одиничного ~, який замість цього дотримується синтаксичних правил для змінних. Наприклад, він розширюється всередині подвійних лапок, може бути скинутий, і до нього можуть бути застосовані операнди обробки рядків .


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, який має спеціальний синтаксис для змінного розширення). Однак інші місця дозволяють розширення tilde як виняток (наприклад, systemd ), але запитувати базу даних passwd безпосередньо замість використання $HOME.


Ще одна велика різниця, яку ви показуєте тут, але не згадуєте, полягає в тому, що ви можете змінити значення $HOME, але ви не можете (безпосередньо) змінити значення ~.
Джо

Тому я запитав, коли робити, $HOMEа ~не посилатися на одне і те саме - вони зазвичай роблять за замовчуванням - і тоді ви навмисно призначаєте змінну оточення, щоб вони не посилалися на одне і те ж. Це хороша демонстрація, але зайво заплутана.
H2ONaCl

1

$ HOME / швидше працює у стандартному POSIX.2 Bourne / bin / sh, оскільки розширення tilde є розширенням, знайденим у BSD csh tcsh GNU bash та інших.

Якщо ви хочете писати скрипти, переносні на busbox або тире або BSD sh, вкладайте гроші в додаткові літери, щоб не зірватися з ~ /: Немає такого файлу чи каталогу в певних системах.

Я також вважаю, що $ HOME / більше читається.


У сценарії важлива читабельність та наочність. Можливо, саме тому мої сценарії використовують $HOMEі рідко використовують ~. Моя колишня власна людина, мабуть, знала це.
H2ONaCl
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.