$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
~
Супроводжуваний +
або -
і додатковий номер буде розширюватися до елементів стека каталогів :
$ 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
, який має спеціальний синтаксис для змінного розширення). Однак інші місця дозволяють розширення tilde як виняток (наприклад, systemd ), але запитувати базу даних passwd безпосередньо замість використання $HOME
.
$HOME
, але ви не можете (безпосередньо) змінити значення ~
.
$HOME
а ~
не посилатися на одне і те саме - вони зазвичай роблять за замовчуванням - і тоді ви навмисно призначаєте змінну оточення, щоб вони не посилалися на одне і те ж. Це хороша демонстрація, але зайво заплутана.
$ HOME / швидше працює у стандартному POSIX.2 Bourne / bin / sh, оскільки розширення tilde є розширенням, знайденим у BSD csh tcsh GNU bash та інших.
Якщо ви хочете писати скрипти, переносні на busbox або тире або BSD sh, вкладайте гроші в додаткові літери, щоб не зірватися з ~ /: Немає такого файлу чи каталогу в певних системах.
Я також вважаю, що $ HOME / більше читається.
$HOME
і рідко використовують ~
. Моя колишня власна людина, мабуть, знала це.
~
є оболонка залежить в той час як $ HOME немає.