如何在 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

相关内容