X セッションの最初のシェルの起動時にのみコマンドを起動するにはどうすればよいですか?

X セッションの最初のシェルの起動時にのみコマンドを起動するにはどうすればよいですか?

Pop-OS! 20.04 で Gnome を実行しています。

私はシェルterminatorを使用しています。Xセッションで zsh シェルを初めて使用するときにのみzsh起動したいです。fortune

私は次のようなことを試しました.zshrc:

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

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

追記:この質問に適切なタグを見つけるのに苦労しました

答え1

「X セッションごとに 1 回」という正確な要件を考えると、現在の X セッションで既に実行されたという情報を保存する最も自然な場所は、X サーバーの状態です。X サーバーにはカスタム グローバル データを格納するための場所はありませんが、いつでも変更できるカスタム グローバル構成を格納する場所はあります。これは、ここでの目的には十分です。X リソースXリソースを操作するためのコマンドラインツールはxrdb

これはxrdb奇妙であり、X.org の実装には非常に長年のバグがあることに注意してください。おそらく、xrdb -load(ドキュメントに記載されているように、以前に読み込まれたすべての構成を削除します) やxrdb -remove(本来の動作とは異なり、以前に読み込まれたすべての構成を削除します) は使用したくないでしょう。

未テストのコード.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

テストのオプションを設定解除するには:

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

これはアトミックではないことに注意してください。zshfortuneインスタンスをほぼ同時に起動すると、複数回実行される可能性があります。

答え2

これはfortune、他の zsh シェルが実行されていない場合にのみ起動します。

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

関連情報