Como iniciar um comando na inicialização apenas do primeiro shell de uma sessão X?

Como iniciar um comando na inicialização apenas do primeiro shell de uma sessão X?

Estou executando o Gnome no Pop-OS! 20.04.

Estou usando terminatore zshshell. Quero iniciar fortuneapenas na primeira vez que usar o zsh shell em uma sessão X.

Eu tentei esse tipo de coisa em .zshrc:

### count the lines of
ps -ax | grep zsh
ps -ax | grep /zsh

###
[ -z "$(pidof zsh)" ] && fortune

PS: Tive dificuldade em encontrar tags apropriadas para esta pergunta

Responder1

Dado o requisito preciso “uma vez por sessão X”, o local mais natural para armazenar a informação de que isso já foi feito na sessão X atual é no estado do servidor X. Não existe realmente um local pretendido para dados globais personalizados em um servidor X, mas há um local para configuração global personalizada que pode ser alterada a qualquer momento, o que é próximo o suficiente para o propósito aqui:Recursos X. A ferramenta de linha de comando para manipular recursos X éxrdb.

Cuidado, isso xrdbé peculiar e a implementação do X.org tem bugs extremamente antigos. Você provavelmente não deseja usar xrdb -load(que remove todas as configurações carregadas anteriormente conforme documentado) ou xrdb -remove(que remove todas as configurações carregadas anteriormente, ao contrário do que deveria fazer).

Código não testado para o seu .zshrc:

if [[ -n ${DISPLAY:+set} ]] && whence xrdb >/dev/null; then
  if xrdb -query | grep -q '^pietrodito\.session\.ran-fortune:.*true'; then
    fortune
    xrdb -merge <<<'pietrodito.session.ran-fortune: true'
  fi
fi

Para desativar a opção de teste:

xrdb -load <(xrdb -query | grep -v '^pietrodito\.session\.ran-fortune:)

Observe que isso não é atômico. fortunepode ser executado várias vezes se você iniciar instâncias zsh quase exatamente ao mesmo tempo.

Responder2

Este será iniciado fortuneapenas se não houver outro shell zsh em execução:

[[ "$(pidof zsh)" == *' '* ]] || fortune

informação relacionada