Posso usar variáveis de ambiente quando #incluindo outro arquivo Xresources

5

No meu arquivo ~/.Xresources , gostaria de incluir outro arquivo cuja localização depende do valor de uma variável de ambiente. Isso é possível?

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

parece não expandir ${env_path} .

    
por René Nyffenegger 26.02.2017 / 08:15

1 resposta

4

Sim, mas não diretamente.

A ferramenta que carrega .Xresources , que é xrdb , invoca o pré-processador C . É daí que vem a diretiva #include . O pré-processador C não fornece acesso a variáveis de ambiente. A saída do pré-processador é interpretada como uma lista de recursos, sem processamento dinâmico adicional, como a interpolação de variáveis.

Você tem duas soluções: usar um pré-processador diferente ou definir uma variável ao invocar xrdb e usá-la. De qualquer forma, você precisará alterar a maneira como xrdb é chamado - adicione um comando xrdb aos seus scripts de inicialização da sessão X.

Para usar uma variável com o pré-processador C, passe-a na linha de comando xrdb :

xrdb -DEXTRA_RESOURCES_FILE="<$env_path/abc/def/Xresources>" -merge ~/.Xresources

e use essa variável no seu arquivo:

#include EXTRA_RESOURCES_FILE

Observe que você está limitado no que pode em uma diretiva de inclusão, porque o pré-processador não possui nenhum recurso de processamento de string, nem mesmo concatenação. Todo o nome do arquivo deve ser especificado como uma única string. Além disso, xrdb parece transformar silenciosamente " em _ , mas felizmente deixa <> passar.

Se você quer mais flexibilidade, você pode usar um pré-processador diferente. Eu uso m4 , que é peculiar e não ideal, mas não pior do que o pré-processador C. O M4 possui recursos reais de processamento de sequências e pode incluir outros arquivos. Não pode acessar variáveis de ambiente diretamente, no entanto. Com o GNU m4, você pode fazer isso, mas você tem que usar um escape de shell. Se você for executar uma invocação personalizada de xrdb , também poderá transmitir a variável de ambiente nesse ponto.

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

No arquivo .Xresources :

m4_include(env_path/abc/def/Xresources)

Observe que m4 usa '…' para citar strings. Para incluir um ' na saída, você precisa alterar temporariamente o caractere de aspas.

Alternativamente, se tudo que você precisa é incluir um arquivo extra, basta executar

xrdb -merge "$env_path/abc/def/Xresources"
    
por 27.02.2017 / 00:25