$ HOME環境変数が設定されている場所を探しています。ログイン後のことです。
Linux debian 2.6.32-5-686を使用しています。
あなたのホームを変更しようとしている場合は、行うことができます
export HOME=/home/...
シェル、または〜/ .profileファイルまたは〜/ .bashrc(または適切なログインシェル)のいずれか。
(上記のコードは、Debianのデフォルトであるbashおよび類似のシェルで機能します。それ以外の場合は、 `setenv HOME $ HOME:/ extra/pathを実行します。他のディストリビューションのcshのようなシェルで考えます。)
編集-ただし、これはおそらくそうする方法ではありません。他の回答を参照してください。この回答は使用しないでください。
Linuxでは、HOME
環境変数はログインプログラムによって設定されます。
login
、telnetおよびrloginセッションsshd
gdm
、kdm
またはxdm
。ログインプログラムは、/ etc/passwdの値に基づいて、シェルでexecを呼び出す前に(execへの引数にそれを含めることで)配置します。
usermod -d /home/whatever_dir whatever_user
を実行してこれを編集します。
これが(明らかに)新しいホームディレクトリになることに注意してください。 Bashはログイン時にcd
を実行します。そのため、Bashが存在し、権限が正しいことを確認してください。また、.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
私はいくつかの掘り出し物をしました、そしてこれに対する答えは少し意外です。次のテストスクリプトを取り、chmod +x
してください。
#!/bin/bash
printf 'My home is: '
echo ~ || echo 'nowhere'
./test.sh
で実行すると、次のようになります。
私の家:/ home/user
Straceを使って内部をのぞいてみましょう。
$ 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
openat(AT_FDCWD、 "/lib/x86_64-linux-gnu/libc.so.6"、O_RDONLY | O_CLOEXEC)= 3
openat(AT_FDCWD、 "/ dev/tty"、O_RDWR | O_NONBLOCK)= 3
openat(AT_FDCWD、 "/ usr/lib/locale/locale-archive"、O_RDONLY | O_CLOEXEC)= 3
openat(AT_FDCWD、 "/usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache"、O_RDONLY)= 3
openat(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 -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
openat(AT_FDCWD、 "/lib/x86_64-linux-gnu/libc.so.6"、O_RDONLY | O_CLOEXEC)= 3
openat(AT_FDCWD、 "/ dev/tty"、O_RDWR | O_NONBLOCK)= 3
openat(AT_FDCWD、 "/etc/nsswitch.conf"、O_RDONLY | O_CLOEXEC 3)==
openat(AT_FDCWD、 "/etc/ld.so.cache"、O_RDONLY | O_CLOEXEC)= 3
openat(AT_FDCWD、 "/lib/x86_64-linux-gnu/libnss_compat.so.2"、O_RDONLY | O_CLOEXEC)= 3
openat(AT_FDCWD、 "/etc/ld.so.cache"、O_RDONLY | O_CLOEXEC)= 3
openat(AT_FDCWD、 "/lib/x86_64-linux-gnu/libnss_nis.so.2"、O_RDONLY | O_CLOEXEC)= 3
openat(AT_FDCWD、 "/lib/x86_64-linux-gnu/libnsl.so.1"、O_RDONLY | O_CLOEXEC)= 3
openat(AT_FDCWD、 "/lib/x86_64-linux-gnu/libnss_files.so.2"、O_RDONLY | O_CLOEXEC)= 3
openat(AT_FDCWD、 "/ etc/passwd"、O_RDONLY | O_CLOEXEC 3)==
openat(AT_FDCWD、 "./test.sh"、O_RDONLY)= 3
興味深いラインを太字にしています。ご覧のとおり、$HOME
が定義されていない場合、ログインモードまたはインタラクティブモードではない場合でも、シェルはそれを入力しようとします。