如何在 X 會話的第一個 shell 啟動時啟動命令?

如何在 X 會話的第一個 shell 啟動時啟動命令?

我在 Pop-OS 上運行 Gnome! 20.04。

我正在使用terminatorzsh外殼。我只想在fortune第一次在 X 會話中使用 zsh shell 時啟動。

我已經嘗試過這些事情.zshrc

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

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

PS:我很難找到適合這個問題的標籤

答案1

考慮到「每個 X 會話一次」的精確要求,儲存目前 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:)

請注意,這不是原子的。fortune如果您幾乎同時啟動 zsh 實例,則可能會執行多次。

答案2

fortune僅當沒有其他 zsh shell 運行時才會啟動:

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

相關內容