在我的~/.Xresources
文件中,我想包含另一个文件,其位置取决于环境变量的值。这可能吗?
#include "${env_path}/abc/def/Xresources"
似乎没有扩大${env_path}
。
答案1
是的,但不是直接的。
加载的工具.Xresources
是xrdb
,调用C预处理器。这就是该#include
指令的来源。 C 预处理器不提供对环境变量的访问。预处理器的输出被解释为资源列表,没有进一步的动态处理,例如变量插值。
您有两种解决方案:要么使用不同的预处理器,要么在调用时定义一个变量xrdb
并使用它。无论哪种方式,您都需要更改xrdb
调用方式 - 将xrdb
命令添加到 X 会话启动脚本中。
要将变量与 C 预处理器一起使用,请在xrdb
命令行上传递它:
xrdb -DEXTRA_RESOURCES_FILE="<$env_path/abc/def/Xresources>" -merge ~/.Xresources
并在您的文件中使用该变量:
#include EXTRA_RESOURCES_FILE
请注意,您在 include 指令中的功能受到限制,因为预处理器没有任何字符串处理功能,甚至没有连接功能。整个文件名必须指定为单个字符串。而且xrdb
似乎是无声无息的化为"
,_
幸好它透了<>
出来。
如果您想要更大的灵活性,可以使用不同的预处理器。我用米4,这很奇怪,也不理想,但并不比 C 预处理器差。 M4 具有实际的字符串处理功能,并且可以包含其他文件。但是,它无法直接访问环境变量。使用 GNU m4,您可以做到这一点,但您必须使用 shell 转义。如果您要运行自定义xrdb
调用,那么您最好在此时传递环境变量。
xrdb -D"env_path=$env_path" -merge ~/.Xresources
在.Xresources
文件中:
m4_include(env_path/abc/def/Xresources)
请注意,m4 用于`…'
引用字符串。要`
在输出中包含 a,您需要临时更改引号字符。
或者,如果您只需要包含一个额外的文件,只需运行
xrdb -merge "$env_path/abc/def/Xresources"