O que aprendi tentando colocar o Homebrew no PATH e XDG

 




    Queria uma coisa simples: adicionar o Homebrew ao PATH e ao XDG_DATA_DIRS sem sobrescrever nada do sistema, usando o mecanismo "correto" e declarativo do systemd — o environment.d. Configurei tudo certinho, testei o generator isoladamente e funcionou perfeitamente. Só que, na hora H, echo $PATH no terminal e no TTY continuava sem nenhum sinal do brew.

O primeiro suspeito: um generator concorrente

Rodando systemctl --user show-environment, o valor simplesmente não aparecia — nem depois de reiniciar. A pista veio ao listar todos os generators em /usr/lib/systemd/user-environment-generators/: além do 30-systemd-environment-d-generator (o que lê os arquivos .conf), havia um 60-flatpak, rodando depois. A própria documentação do Arch registra que outros generators nessa pasta — o flatpak incluso — podem não colocar aspas corretamente nos valores que exportam, o que é o tipo de bug capaz de fazer uma variável inteira ser descartada na cadeia.

O suspeito de verdade

Mesmo contornando isso, o problema persistia. A causa real era mais estrutural: environment.d alimenta o ambiente interno da instância systemd --user — usado por serviços que o systemd gerencia, não pelo seu shell. Se algo não injeta esse ambiente na sua sessão de login, ele nunca chega no terminal.

E aqui está a parte interessante: isso depende de qual display manager você usa.

  • GDM (GNOME): em sessões Wayland, não lê arquivos de shell como ~/.bash_profile. Em vez disso, importa diretamente o ambiente do systemd --user. Resultado: environment.d é obrigatório — sem ele, nem os apps abertos pelo menu enxergam o PATH customizado.
  • SDDM e derivados (como o Plasma Login Manager do KDE): fazem o oposto. Eles leem ~/.bash_profile (bash) ou ~/.zprofile/~/.zlogin (zsh) como shell de login, antes de subir a sessão gráfica — e não integram o ambiente do systemd --user de forma nativa. Como toda a sessão nasce como processo filho desse shell, um simples export no perfil já propaga para tudo: terminal, TTY, e qualquer app lançado por .desktop.

A configuração final

Para GNOME, em ~/.config/environment.d/99-linuxbrew.conf:

PATH=${PATH}:/home/linuxbrew/.linuxbrew/bin:/home/linuxbrew/.linuxbrew/sbin
XDG_DATA_DIRS=${XDG_DATA_DIRS:-/usr/local/share/:/usr/share/}:/home/linuxbrew/.linuxbrew/share

Para KDE (ou qualquer DM baseado em SDDM), em ~/.bash_profile:

export PATH="$PATH:/home/linuxbrew/.linuxbrew/bin:/home/linuxbrew/.linuxbrew/sbin"
export XDG_DATA_DIRS="${XDG_DATA_DIRS:-/usr/local/share/:/usr/share/}:/home/linuxbrew/.linuxbrew/share"

A lição

Não existe "o jeito certo" universal de configurar variáveis de ambiente no Linux — existe o jeito certo para o seu display manager. Antes de assumir que environment.d vai "simplesmente funcionar", vale a pena confirmar se o seu login manager realmente lê esse ambiente, ou se ele espera a configuração no lugar mais antigo e mais chato de sempre: o perfil do shell.

Comentários

Postagens mais visitadas deste blog

Wifi Country code no Fedora

Fedora Kinoite, um sistema com um nome curioso...