$ HOME環境変数はどこに設定されていますか?


16

$ HOME環境変数が設定されている場所を探しています。ログイン後です。

Linux debian 2.6.32-5-686を使用しています。

回答:


2

ホームを変更しようとしている場合は、次のことができます

export HOME=/home/... 

シェル、または〜/ .profileファイルおよび/または〜/ .bashrc(または適切なログインシェル)のいずれか。

(上記のコードは、Debianのデフォルトであるbashおよび同様のシェルで動作します。そうでなければ、他のディストリビューションのcshのようなシェルで `setenv HOME $ HOME:/ extra / pathを実行します。)

編集 -しかし、これはおそらくそれを行う方法ではありません。他の回答をご覧ください。この回答は使用しないでください。


あなたはおそらく混乱$HOMEしてい$PATHます。複数のパスを$HOME含めること(値全体が単一のパス名として扱われること)、またはほとんどの場合、$HOMEまったく変更することは意味がありません。
user1686

@grawity:おっと、ありがとう。残念ながら、回答を削除できません。
ユーザー76871

21

Linuxでは、HOME環境変数はログインプログラムによって設定されます。

  • ことでlogin、コンソール、上のtelnetrloginのセッション
  • よるsshdSSH接続用
  • またはグラフィカルセッションのために。gdmkdmxdm

8

ログインプログラムは、/ etc / passwdの値に基づいて、シェルでexecを呼び出す前に(execの引数に含めることにより)配置します。


1
興味深いことに、これ以上の投票はありませんでした。これ、環境変数が設定されている場所を実際に指定する唯一の答えです。これは、OPの実際の質問でした。
マイクウィリアムソン

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で内部を覗いてみましょう。

$ 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定義されていない場合、シェルはログインモードまたはインタラクティブモードでない場合でも、それを埋めようとします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.