我正在寻找设置 $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 那么重要)。
答案2
在 Linux 上,HOME
环境变量由登录程序设置:
- 通过
login
控制台,远程登录和登录会议 - 用于
sshd
SSH 连接 - 由
gdm
或kdm
用于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 也会尝试填充它。