.png)
Недавно я добавил 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 сопоставление клавишэто не должно применяться к моему серверу.