目标
我正在运行 Arch Linux。我想将所有 config/data/cache/state 文件存储在 的子目录中~/local
,如下所示:
~
├── downloads
├── documents
└── local
├── data
├── state
├── config
└── cache
尝试
为了做到这一点,我设置了如下环境变量:
# set up XDG directories
export XDG_DATA_HOME=$HOME/local/data
export XDG_CONFIG_HOME=$HOME/local/config
export XDG_STATE_HOME=$HOME/local/state
export XDG_CACHE_HOME=$HOME/local/cache
# enable compliance
export ZDOTDIR=$XDG_CONFIG_HOME/zsh
export HISTFILE=$XDG_STATE_HOME/zsh/history
它目前被放置在/etc/zsh/zshenv
(正如我使用的那样zsh
),但是,我也尝试将它放置在~/local/config/zsh/.zshenv
并且仅$ZDOTDIR
全局设置。
我可以在 shell 中看到设置的环境变量:
% echo $XDG_CONFIG_HOME
# /home/myuser/local/config
% echo $ZDOTDIR
# /home/myuser/local/config/zsh
问题
我运行的许多(但不是全部)程序似乎都不尊重我设置的变量。
例如,Hyprland
忽略$XDG_CONFIG_HOME
并创建默认配置文件~/.config/hypr/hyprland.conf
,尽管~/local/config/hypr/hyprland.conf
该文件已存在。然后它读取该文件它创建并抱怨我的配置没有被修改。我的终端仿真器也出现了同样的问题,kitty
, 哪个明确实现 XDG 基础目录。
但是其他程序,例如tealdeer
并且zsh
本身尊重变量并将文件放在我指定的目录中。
为什么据称支持标准的软件不会根据我设置的环境变量改变行为?
答案1
我解决了这个问题以及评论中提供的所有有用建议。好极了。
问题是,由于我在中定义了环境变量/etc/zsh/zshenv
,因此它们只能在 Zsh shell 中设置,并且不是在通过显示管理器进行图形登录期间。通过登录到不同的 TTY 并从命令行手动启动 Hyprland 来测试此理论,结果证明是成功的。
为了解决这个问题,我遵循了建议在 Arch Wiki 中并在中定义变量/etc/security/pam_env.conf
:
# ...
XDG_CONFIG_HOME DEFAULT=@{HOME}/local/config
XDG_STATE_HOME DEFAULT=@{HOME}/local/state
XDG_DATA_HOME DEFAULT=@{HOME}/local/data
XDG_CACHE_HOME DEFAULT=@{HOME}/local/cache
ZDOTDIR DEFAULT=${XDG_CONFIG_HOME}/zsh
因此,无论上下文如何,这些变量现在都会被加载,并且 Hyprland(以及一些直接从其运行的程序)将尊重我设置的首选项。