在 bash 脚本(.bashrc 等)中检测 X 会话

在 bash 脚本(.bashrc 等)中检测 X 会话

最近我把它放到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当显示器存在时,这些脚本在显示器上运行,但当显示器不存在时,它们的工作方式不同。在 my 的顶部crontab,我将DISPLAY变量设置为,:0即使它尚不存在。无论您是否有显示器,crontab以 开头的脚本都会启动。@reboot这将允许您在同一脚本中动态检测显示何时出现和消失。

注意:>&仅适用于bash>= 4。否则使用> /dev/null 2>&1

答案2

我认为检查DISPLAY是最好的方法。

  • 它处理远程登录(例如 ssh -X)。
  • 它适用于大多数(如果不是全部)平台。
  • 它独立于窗口管理器/DE。

答案3

我通常使用该TERM变量来测试脚本中的 X。

TERM通常设置为linux在 TTY 和xtermX 上。
我在这里使用“通常”一词,因为像 GNU Screen 和 TMux 这样的应用程序似乎会混淆变量TERM

答案4

在普通的 bash 脚本中:if [[ $DISPLAY ]]

在同一台计算机上,$DISPLAY将在终端模拟器中返回0:0,但在真实终端中不会返回任何内容。这可以很容易地用CtrlAltF1vs进行测试CtrlAltF7

bash基于的条件如下$DISPLAY所示:

if [[ $DISPLAY ]]; then 
fi

.profile.personalif xhost >& /dev/null

根据我的经验,在执行或扩展$DISPLAY时尚未设置。对于这些情况,.profile.personal用户回答 cmevoli服务最好:

if xhost >& /dev/null; then
fi

我在定义桌面时遇到了这个问题CapsLock 键映射这不应该适用于我的服务器。

相关内容