![Как запустить команду при запуске только самой первой оболочки X-сессии?](https://rvso.com/image/191812/%D0%9A%D0%B0%D0%BA%20%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D1%82%D0%B8%D1%82%D1%8C%20%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D1%83%20%D0%BF%D1%80%D0%B8%20%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA%D0%B5%20%D1%82%D0%BE%D0%BB%D1%8C%D0%BA%D0%BE%20%D1%81%D0%B0%D0%BC%D0%BE%D0%B9%20%D0%BF%D0%B5%D1%80%D0%B2%D0%BE%D0%B9%20%D0%BE%D0%B1%D0%BE%D0%BB%D0%BE%D1%87%D0%BA%D0%B8%20X-%D1%81%D0%B5%D1%81%D1%81%D0%B8%D0%B8%3F.png)
Я использую 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