Как запустить команду при запуске только самой первой оболочки X-сессии?

Как запустить команду при запуске только самой первой оболочки X-сессии?

Я использую Gnome на Pop-OS! 20.04.

Я использую terminatorи zshоболочку. Я хочу запустить fortuneтолько первый раз, когда я использую оболочку zsh в сеансе X.

Я пробовал такие вещи в .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:

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

Связанный контент