Primeiro, vamos tirar isso do caminho. EnvironmentFile
não é uma opção de acordo com esta resposta .
Tenha paciência comigo, estou indo para um exemplo específico do que estou tentando alcançar. Eu estou tentando entender a maneira recomendada de usar e passar variáveis de ambiente.
Eu tenho um urxvtd.socket
:
[Unit]
Description=urxvt deamon (socket activation)
Documentation=man:urxvtd(1) man:urxvt(1)
[Socket]
ListenStream=%t/urxvt/urxvtd-%H
[Install]
WantedBy=sockets.target
Agora, um urxvtd.socket
com uma dependência Requires
nesse urxvtd.socket:
[Unit]
Description=Urxvt Terminal Daemon
Requires=urxvtd.socket
[Service]
# Needs to know socket file location RXVT_SOCKET environment variable.
# Where will it come from?
ExecStart=/usr/bin/urxvtd -o -q
[Install]
WantedBy=default.target
Agora eu preciso que RXVT_SOCKET
seja definido antes de iniciar o i3, já que o i3 terá uma ligação de chave para iniciar o urxvtc
(cliente urxvt).
Se eu iniciar o i3 / Xorg sem o systemd (ou seja, com xinitrc), e coloque .zshenv
(arquivo de ambiente específico do usuário carregado sempre.):
export RXVT_SOCKET=${XDG_RUNTIME_DIR}/urxvt/urxvtd-machinename
Então, urxvtc
lançado pelo i3 inferirá corretamente a variável RXVT_SOCKET e procurará pelo soquete nesse caminho.
No entanto, o urxvtd.service
lança urxvtd
(o daemon), portanto também precisa de RXVT_SOCKET.
O Archwiki recomenda definir o ambiente em urxvtd.service
:
...
Environment=RXVT_SOCKET=%t/urxvtd-%H
...
Mas aí está o problema. Por que a variável de ambiente deve ser definida novamente em urxvtd.service
, quando o usuário inicial urxvtd.socket
deve defini-la?
Note que é definido novamente em .zshenv
para o i3 para obtê-lo. Este é um caso de várias fontes de verdade para uma variável de ambiente simples. .
Percebemos que urxvtd.service
exemplo acima tem o caminho incorreto para RXVT_SOCKET definido em .zshenv
? Reitera minha múltipla fonte do argumento da verdade.
Qual é a melhor maneira de lidar com isso?
Eu estava pensando que talvez eu possa definir o RXVT_SOCKET em urxvtd.socket
da seguinte forma:
[Socket]
Environment=RXVT_SOCKET
ListenStream=%t/urxvt/urxvtd-%H
E como urxvtd.service
é uma dependência, deve haver uma maneira de importar a variável de ambiente. Mas não há. Assim, o dax do urxvtd se comportará como se o RXVT_SOCKET não estivesse configurado, mas o soquete seria criado corretamente devido a urxvtd.socket
.
Depois, comecei a cavar um pouco mais e systemctl --user import-environment RXVT_SOCKET
deve importar a variável em unidades do systemd. Isso seria realmente o caminho? Então eu também preciso garantir que a importação ocorra antes de o urxvtd.service ser executado. Como isso funcionaria?
Se eu usar o Xorg / i3 com o systemd, acredito que deve haver uma maneira de transferir a variável de ambiente em unidades do systemd.
Neste ponto, é provável que eu acredite que não exista uma solução pura de systemd para tal requisito de propagação de variáveis de ambiente
Acabei usando um shell para agrupar o comando ExecStart
, já que o shell herdará o ambiente corretamente.