我想在脚本中本地覆盖用户的主位置,以强制应用程序可移植地存储/加载其设置。
export HOME=$TMPDIR/Data
export XDG_CONFIG_HOME=$TMPDIR/Data
这些在大多数情况下都有效,但有一些应用程序仍然可以找到“真正的”主路径。
为什么我覆盖用户主位置的方法不起作用?
答案1
不幸的是,这很大程度上取决于您的应用程序是什么。应用程序可以通过多种方式显示用户的主目录。
$HOME
你已经知道这一点了。
$HOME
是一个可以通过登录配置覆盖的环境变量。文件,例如.bashrc
或.bash_profile
Bash 环境中的文件。该值通常类似于/home/username
。/home/$USER
我认为这是 的变体
$HOME
,但我遇到过一些应用程序愚蠢地假设用户的主目录必须位于 下/home
,因此他们附加该变量$USER
并使用它。解析
/etc/passwd
就获取用户主目录的最糟糕方法而言,这可能是最严重的罪犯,但许多工具和脚本都是这样做的。他们中的大多数都是这样的变体,他们使用
getent
命令:$ getent passwd | grep $1 | awk -F: '{ print $6 }' # for example (user "saml") $ getent passwd | grep saml | awk -F: '{ print $6 }' /home/saml
存储用户信息的后端“数据库”可以是从文件
/etc/passwd
、NIS 到 LDAP 数据库的任何内容。GTK &
g_get_home_dir()
GTK 库提供了一个 API,
g_get_home_dir()
它将从“passwd”后端提取用户信息,而不是使用$HOME
.请注意,与传统的 Unix 工具相比,此函数更喜欢 passwd 条目而不是 HOME 环境变量。
凯德
KDE 似乎使用了 $HOME。它将首先查找,如果未设置则
KDEHOME
返回到。$HOME/.kde
顾名思义,该目录树通常位于用户的主目录中。如果未定义此环境变量,则使用默认位置 $HOME/.kde4。
答案2
有两种方法可以获取当前用户的主目录。
- 一种方法是查看用户的密码条目(在
/etc/passwd
)。 - 另一种方法是查看
HOME
环境变量。$HOME
实际上是从 passwd 条目设置的。可能设置它的应用程序包括终端仿真器、登录管理器和 sudo。
您无法欺骗的应用程序可能正在查看用户的密码条目。它们也有可能将用户的主目录存储在某处(可能作为某个文件或目录的绝对路径的一部分)并忽略两者HOME
和 passwd 条目。
检查应用程序是否使用HOME
环境变量的一种方法是 grep 查找它。例如,grep HOME /usr/bin/pdftex
将返回Binary file /usr/bin/pdftex matches
,表示pdftex
可能会使用$HOME
。
要获得更明确的答案,请查看应用程序的源代码。
用于grep -r 'getenv\s\?(.*HOME'
稍微加快源代码分析速度。