#include 另一个 Xresources 文件时可以使用环境变量吗

Ren*_*ger 6 environment-variables x-resources

在我的~/.Xresources文件中,我想包含另一个文件,其位置取决于环境变量的值。这可能吗?

#include "${env_path}/abc/def/Xresources"
Run Code Online (Sandbox Code Playgroud)

似乎没有扩大${env_path}

Gil*_*il' 9

是的,但不是直接的。

加载的工具.Xresources,即xrdb调用C 预处理器。这就是#include指令的来源。C 预处理器不提供对环境变量的访问。预处理器的输出被解释为资源列表,没有进一步的动态处理,例如变量插值。

您有两种解决方案:要么使用不同的预处理器,要么在调用xrdb和使用它时定义一个变量。无论哪种方式,您都需要更改xrdb调用方式——将xrdb命令添加到您的 X 会话启动脚本中。

要在 C 预处理器中使用变量,请在xrdb命令行上传递它:

xrdb -DEXTRA_RESOURCES_FILE="<$env_path/abc/def/Xresources>" -merge ~/.Xresources
Run Code Online (Sandbox Code Playgroud)

并在您的文件中使用该变量:

#include EXTRA_RESOURCES_FILE
Run Code Online (Sandbox Code Playgroud)

请注意,您在 include 指令中的功能受到限制,因为预处理器没有任何字符串处理功能,甚至没有连接。必须将整个文件名指定为单个字符串。再者xrdb似乎无声无息地变成"_,幸好它让<>了过去。

如果您想要更大的灵活性,您可以使用不同的预处理器。我使用m4,它古怪而不理想,但并不比 C 预处理器差。M4 具有实际的字符串处理能力,并且可以包含其他文件。但是,它不能直接访问环境变量。使用 GNU m4,你可以做到,但你必须使用 shell 转义。如果您要运行自定义xrdb调用,则最好在此时传递环境变量。

xrdb -D"env_path=$env_path" -merge ~/.Xresources
Run Code Online (Sandbox Code Playgroud)

.Xresources文件中:

m4_include(env_path/abc/def/Xresources)
Run Code Online (Sandbox Code Playgroud)

请注意, m4 用于`…'引用字符串。要`在输出中包含 a ,您需要临时更改引号字符。

或者,如果您只需要包含一个额外的文件,只需运行

xrdb -merge "$env_path/abc/def/Xresources"
Run Code Online (Sandbox Code Playgroud)