Могу ли я использовать переменные среды, если #including другой файл Xresources

В моем файле ~/.Xresources я хотел бы включить другой файл, местоположение которого зависит от значения переменной среды. Это возможно?

 #include "${env_path}/abc/def/Xresources" 

похоже, не расширяет ${env_path} .

Да, но не напрямую.

Инструмент, который загружает .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 похоже, молча преобразует " в _ , но, к счастью, он пропускает <> .

Если вам нужна большая гибкость, вы можете использовать другой препроцессор. Я использую m4 , который является изворотливым и не идеальным, но не хуже, чем препроцессор C. M4 имеет реальные возможности обработки строк и может включать в себя другие файлы. Однако он не может напрямую обращаться к переменным среды. С GNU m4 вы можете это сделать, но вам нужно использовать оболочку. Если вы собираетесь запустить пользовательский вызов xrdb , вы можете также передать переменную окружения в этот момент.

 xrdb -D"env_path=$env_path" -merge ~/.Xresources 

В файле .Xresources :

 m4_include(env_path/abc/def/Xresources) 

Обратите внимание, что m4 использует `…' для цитирования строк. Чтобы включить ` in output, вам нужно временно изменить символ кавычки.

В качестве альтернативы, если вам нужно всего лишь добавить один дополнительный файл, просто запустите

 xrdb -merge "$env_path/abc/def/Xresources"