Обнаружение сеанса X в скрипте bash (.bashrc и т. д.)

Обнаружение сеанса X в скрипте bash (.bashrc и т. д.)

Недавно я добавил xset b offв свой .bashrc. Теперь меня раздражает ошибка, которая выскакивает, когда я вхожу через tty или через ssh, т. е. вне X-сессии.

Первое, что пришло мне в голову, было [[ -z "$SOME_VAR" ]] && xset b off(ну, как оказалось, тестированиепеременная установлена ​​или пуста(это другой вопрос). Но какой SOME_VAR правильный?

Поэтому я сравнил вывод tty setи вывод urxvt, setчтобы увидеть, какие переменные установлены в X и отсутствуют в tty. Как и ожидалось, различий было довольно много (перечислю только те, которые показались мне важными):

  • DESKTOP_SESSION
  • DISPLAY
  • GDMSESSION
  • SESSION_MANAGER
  • WINDOWID
  • WINDOWPATH
  • XAUTHORITY
  • XDG_SESSION_COOKIE
  • XDG_CONFIG_DIRS
  • XDG_DATA_DIRS
  • XDG_MENU_PREFIX

Какой из них наиболее правильный и универсальный для тестирования, чтобы определить, нахожусь ли я в сеансе X или нет? Что-то, что будет работать на максимально возможном количестве дистрибутивов, платформ и сред рабочего стола?

Или есть способ лучше, чем тестирование переменных окружения?

решение1

Простой и эффективный способ проверить, что ваш дисплейный сервер доступен и действителен, — это протестировать его с помощью xhost. Вы не всегда можете полагаться на проверку значения в DISPLAYпеременной, поскольку она может быть установлена ​​с недопустимым значением.

if xhost >& /dev/null ; then echo "Display exists"
else echo "Display invalid" ; fi

Причина, по которой я это делаю, заключается в том, что я запускаю несколько скриптов в своем пользователе crontab, которые работают с дисплеем, когда он существует, но работают по-другому, когда его нет. В верхней части моего crontabя устанавливаю DISPLAYпеременную в , :0хотя она еще не существует. Скрипты в , crontabкоторые начинаются с , @rebootбудут запускаться независимо от того, есть у вас дисплей или нет. Это позволит вам динамически определять, когда ваш дисплей появляется и исчезает в пределах одного скрипта.

ПРИМЕЧАНИЕ: >&работает только в bash>= 4. В противном случае используйте> /dev/null 2>&1

решение2

Я думаю, что проверка DISPLAYбыла бы лучшим подходом.

  • Он обрабатывает удаленные входы в систему (например, ssh -X).
  • Он доступен на большинстве, если не на всех, платформах.
  • Он не зависит от оконного менеджера/DE.

решение3

Я обычно использую эту TERMпеременную для проверки X в своих скриптах.

TERMобычно устанавливается linuxна TTY и xtermна X.
Я использую здесь слово «обычно», поскольку приложения, такие как GNU Screen и TMux, похоже, вмешиваются в TERMработу переменной.

решение4

В обычном bash-скрипте:if [[ $DISPLAY ]]

На том же компьютере, $DISPLAYнапример, в эмуляторе терминала вернет 0:0, но ничего в реальном терминале. Это можно легко проверить с помощью CtrlAltF1versus CtrlAltF7.

Условие, bashоснованное на , $DISPLAYбудет выглядеть следующим образом:

if [[ $DISPLAY ]]; then 
fi

В .profileили .personal:if xhost >& /dev/null

Из моего опыта, $DISPLAYеще не установлено, когда .profile, или, в более широком смысле, .personalвыполняются. Для этих случаев,ответ пользователя cmevoliлучше всего подходит:

if xhost >& /dev/null; then
fi

Я столкнулся с этой проблемой при определении рабочего столаCapsLock сопоставление клавишэто не должно применяться к моему серверу.

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