Де встановлена ​​змінна середовище $ HOME?


17

Я шукаю місце, де встановлена ​​змінна середовища середовища HOME. На мій погляд, це після входу в систему.

Я використовую Linux debian 2.6.32-5-686.

Відповіді:


2

Якщо ви намагаєтесь змінити свій ДОМОВ, ви можете зробити це

export HOME=/home/... 

або в оболонці, або у вашому файлі ~ / .profile та / або ~ / .bashrc (або відповідної оболонці для входу).

(Вищенаведений код буде працювати для bash та подібних оболонок, які за замовчуванням є в Debian; ви б інакше зробили `setenv HOME $ HOME: / extra / path Я думаю, що на csh-оболонках в інших дистрибутивах.)

редагувати - Однак це, мабуть, не так. Дивіться інші відповіді. Не використовуйте цю відповідь.


Ви, ймовірно , плутаєте $HOMEз $PATH. Немає сенсу мати кілька шляхів $HOME(все значення розглядатиметься як одне ім’я шляху) або, в більшості випадків, $HOMEвзагалі змінювати .
користувач1686

@grawity: ой вибачте, дякую. На жаль, я не можу видалити свою відповідь.
user76871

22

В Linux HOMEзмінна середовища встановлюється програмою входу:

  • по loginна консолі, телнет і RLogin сесій
  • за sshdз'єднаннями SSH
  • від gdm, kdmабо xdmдля графічних сесій.

8

Програма входу впорядковує його перед тим, як викликати exec на своїй оболонці (включивши її в аргументи до exec), виходячи зі значення в / etc / passwd.


1
Цікаво, що це не набрало більше голосів. Це єдина відповідь, яка фактично вказує, де встановлена ​​змінна середовище, що було власне питанням ОП.
Майк Вільямсон

5

Редагувати це, запустивши: usermod -d /home/whatever_dir whatever_user.

Зауважте, що це (очевидно) буде новим домашнім каталогом. Bash зробить cdце під час входу в систему, тому переконайтеся, що він існує та дозволи є правильними Крім того, не забувайте про це .bashrc,.profile , .xinitrcі т.д .; якщо їх немає в домашньому каталозі, вони не будуть прочитані.

Від usermod:

Usage: usermod [options] LOGIN

Options:
  -c, --comment COMMENT         new value of the GECOS field
  -d, --home HOME_DIR           new home directory for the user account
  -e, --expiredate EXPIRE_DATE  set account expiration date to EXPIRE_DATE
  -f, --inactive INACTIVE       set password inactive after expiration
                                to INACTIVE
  -g, --gid GROUP               force use GROUP as new primary group
  -G, --groups GROUPS           new list of supplementary GROUPS
  -a, --append                  append the user to the supplemental GROUPS
                                mentioned by the -G option without removing
                                him/her from other groups
  -h, --help                    display this help message and exit
  -l, --login NEW_LOGIN         new value of the login name
  -L, --lock                    lock the user account
  -m, --move-home               move contents of the home directory to the
                                new location (use only with -d)
  -o, --non-unique              allow using duplicate (non-unique) UID
  -p, --password PASSWORD       use encrypted password for the new password
  -R, --root CHROOT_DIR         directory to chroot into
  -s, --shell SHELL             new login shell for the user account
  -u, --uid UID                 new UID for the user account
  -U, --unlock                  unlock the user account

0

Я трохи копав, і відповідь на це трохи дивує. Візьміть наступний тестовий сценарій і chmod +xце:

#!/bin/bash 
printf 'My home is: '
echo  ~ || echo 'nowhere'

Ми можемо запустити його ./test.shі побачити:

Мій дім: / home / user

Давайте заглянемо під кришку з натяжкою.

$ strace ./test.sh |& grep '^open[a-z]*'

openat (AT_FDCWD, "/etc/ld.so.cache", O_RDONLY | O_CLOEXEC) = 3
openat (AT_FDCWD, "/lib/x86_64-linux-gnu/libtinfo.so.5", O_RDONLY | O_CLOEXEC) = 3
openat ( AT_FDCWD, "/lib/x86_64-linux-gnu/libdl.so.2", O_RDONLY | O_CLOEXEC) = 3
опенати (AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY | O_CLOEX) = 3
openat (AT_FDCWD, "/ dev / tty", O_RDWR | O_NONBLOCK) = 3
опенати (AT_FDCWD, "/ usr / lib / locale / locale-archive", O_RDONLY | O_CLOEXEC) = 3
openat (AT_FDCWD, / us lib / x86_64-linux-gnu / gconv / gconv-module.cache ", O_RDONLY) = 3
опенати (AT_FDCWD," ./test.sh ", O_RDONLY) = 3

Я не бачу жодної згадки про HOME, rc-файли чи passwd. Давайте спробуємо це з чистим оточенням:

env -i bash
echo $HOME  #this will be blank since we cleared the env

Нічого, як очікувалося. Давайте запустимо сценарій у порожній env.

env -i bash
./test.sh 

Мій дім: / home / user

Цікаво, що сценарій здатний повернутися додому. Тепер давайте простежимо.

strace ./test.sh |& grep '^open[a-z]*'

Тепер ми бачимо:

openat (AT_FDCWD, "/etc/ld.so.cache", O_RDONLY | O_CLOEXEC) = 3
openat (AT_FDCWD, "/lib/x86_64-linux-gnu/libtinfo.so.5", O_RDONLY | O_CLOEXEC) = 3
openat ( AT_FDCWD, "/lib/x86_64-linux-gnu/libdl.so.2", O_RDONLY | O_CLOEXEC) = 3
опенати (AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY | O_CLOEX) = 3
openat (AT_FDCWD, "/ dev / tty", O_RDWR | O_NONBLOCK) = 3
опенати (AT_FDCWD, "/etc/nsswitch.conf", O_RDONLY | O_CLOEXEC) = 3
опенати (AT_FDCWD, "/etc/.cld / кеш ", O_RDONLY | O_CLOEXEC) = 3
опенати (AT_FDCWD," /lib/x86_64-linux-gnu/libnss_compat.so.2 ", O_RDONLY | O_CLOEXEC) = 3
опената (AT_FDCWD," /etc/ld.ca.ld.cache " , O_RDONLY | O_CLOEXEC) = 3
опенати (AT_FDCWD, "/lib/x86_64-linux-gnu/libnss_nis.so.2 ", O_RDONLY | O_CLOEXEC) = 3
опенати (AT_FDCWD," /lib/x86_64-linux-gnu/libnsl.so.1 ", O_RDONLY | O_CLOEXEC) = 3
опенати (AT_FDCWD," / lib / x86_64-linux libnss_files.so.2 ",O_RDONLY | O_CLOEXEC) = 3
опената (AT_FDCWD, "/ etc / passwd", O_RDONLY | O_CLOEXEC) = 3
openat (AT_FDCWD, "./test.sh", O_RDONLY) = 3

Я виділив цікаві лінії. Як ми бачимо, може здатися, що коли $HOMEне визначено, оболонка намагатиметься заповнити її, навіть коли не входить у режим входу чи інтерактивного режиму.

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