名义上兼容的软件不尊重 XDG 基本目录环境变量

名义上兼容的软件不尊重 XDG 基本目录环境变量

目标

我正在运行 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(以及一些直接从其运行的程序)将尊重我设置的首选项。

相关内容