¿Cómo ejecutar un comando al inicio solo del primer shell de una sesión X?

¿Cómo ejecutar un comando al inicio solo del primer shell de una sesión X?

¡Estoy ejecutando Gnome en Pop-OS! 20.04.

Estoy usando terminatory zshshell. Quiero iniciar fortunesolo la primera vez que uso zsh shell en una sesión X.

He probado ese tipo de cosas en .zshrc:

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

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

PD: Me costó encontrar etiquetas apropiadas para esta pregunta.

Respuesta1

Dado el requisito preciso "una vez por sesión X", el lugar más natural para almacenar la información que ya se hizo en la sesión X actual es en el estado del servidor X. Realmente no hay un lugar previsto para datos globales personalizados en un servidor X, pero hay un lugar para una configuración global personalizada que se puede cambiar en cualquier momento, lo cual es lo suficientemente cercano para el propósito aquí:X recursos. La herramienta de línea de comando para manipular recursos X esxrdb.

Tenga en cuenta que xrdbes peculiar y que la implementación de X.org tiene errores de larga data. Probablemente no desee utilizar xrdb -load(que elimina todas las configuraciones cargadas previamente según lo documentado) o xrdb -remove(que elimina todas las configuraciones cargadas previamente, a diferencia de lo que se supone que debe hacer).

Código no probado para su .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 desactivar la opción de prueba:

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

Tenga en cuenta que esto no es atómico. fortunepuede ejecutarse varias veces si inicia instancias zsh casi exactamente al mismo tiempo.

Respuesta2

Éste se iniciará fortunesólo si no hay ningún otro shell zsh ejecutándose:

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

información relacionada