Wie startet man einen Befehl beim Start nur der allerersten Shell einer X-Sitzung?

Wie startet man einen Befehl beim Start nur der allerersten Shell einer X-Sitzung?

Ich verwende Gnome auf Pop-OS! 20.04.

Ich verwende terminatoreine Shell. Ich möchte sie nur beim ersten Mal zshstarten, wenn ich die ZSH-Shell in einer X-Sitzung verwende.fortune

Ich habe solche Dinge ausprobiert in .zshrc:

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

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

PS: Es fiel mir schwer, passende Tags für diese Frage zu finden

Antwort1

Angesichts der präzisen Anforderung „einmal pro X-Sitzung“ ist der Status des X-Servers der natürlichste Ort, um die Information zu speichern, dass dies bereits in der aktuellen X-Sitzung geschehen ist. Es gibt auf einem X-Server keinen wirklich vorgesehenen Ort für benutzerdefinierte globale Daten, aber es gibt einen Ort für benutzerdefinierte globale Konfigurationen, die jederzeit geändert werden können und der für diesen Zweck nahe genug ist:X RessourcenDas Kommandozeilentool zur Manipulation von X-Ressourcen istxrdb.

Beachten Sie, dass dies xrdbeigenartig ist und die X.org-Implementierung extrem lange bestehende Fehler aufweist. Sie möchten wahrscheinlich nicht verwenden xrdb -load(das alle zuvor geladenen Konfigurationen wie dokumentiert entfernt) oder xrdb -remove(das alle zuvor geladenen Konfigurationen entfernt, anders als es eigentlich tun soll).

Ungetesteter Code für Ihr .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

So deaktivieren Sie die Option zum Testen:

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

Beachten Sie, dass dies nicht atomar ist. fortuneEs kann mehrere Male ausgeführt werden, wenn Sie Zsh-Instanzen fast genau zur gleichen Zeit starten.

Antwort2

Dieses wird fortunenur gestartet, wenn keine andere ZSH-Shell ausgeführt wird:

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

verwandte Informationen