$HOME 环境变量在哪里设置?

$HOME 环境变量在哪里设置?

我正在寻找设置 $HOME 环境变量的位置。我认为是在登录后。

我正在使用 Linux debian 2.6.32-5-686。

答案1

如何更改: https://superuser.com/a/694428/76871

(它在 中定义/etc/passwd;使用 编辑它usermod -d /some/new/home/dir myusername,尽管修改文件也可能有效)


当将主目录写入 $HOME 环境变量时: https://superuser.com/a/271935/76871 https://superuser.com/a/271927/76871

(该字符串作为参数传递给登录程序,该程序稍后将设置 $HOME 环境变量)


旁注:当 $HOME 变量未定义时,bash shell 将从其官方定义中获取它/etc/passwd并在该脚本中定义它。这可能表明您的脚本或编程语言可能对 $HOME 变量有特殊处理,因为它有点“重要”(尽管可能不如 $PATH 那么重要)。

https://superuser.com/a/1502106/76871

答案2

在 Linux 上,HOME环境变量由登录程序设置:

  • 通过login控制台,远程登录登录会议
  • 用于sshdSSH 连接
  • gdmkdm用于xdm图形会话。

答案3

登录程序根据 /etc/passwd 中的值,在你的 shell 上调用 exec 之前对其进行安排(通过将其包含在 exec 的参数中)。

答案4

我做了一些调查,答案有点令人惊讶。以下面的测试脚本为例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未定义时,即使未处于登录或交互模式,shell 也会尝试填充它。

相关内容