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

Alo*_*dal 18 bash xorg environment-variables

最近我把它放到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 会话中,哪一个是最正确和最通用的测试?可以在尽可能多的发行版、平台和桌面环境中运行的东西?

或者有比测试环境变量更好的方法吗?

Ren*_*nan 15

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

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

  • @frostschutz 不,我正在尝试仅运行脚本的相关部分。抑制错误消息不会朝这个方向迈出任何一步。事实上,它可能会导致严重的混乱,对可能会破坏的*其他*事物进行故障排除。 (3认同)
  • 我也会选择`DISPLAY`,或者只是简单地抑制错误消息。不时给 `/dev/null` 一些爱。 (2认同)

cme*_*oli 13

测试您的显示服务器是否可用且有效的一种简单而有效的方法是使用xhost. 您不能总是依赖检查DISPLAY变量中的值,因为它可能被设置为无效值。

if xhost >& /dev/null ; then echo "Display exists"
else echo "Display invalid" ; fi
Run Code Online (Sandbox Code Playgroud)

我这样做的原因是因为我在我的用户crontab中运行了几个脚本,当它存在时对显示进行操作,但在不存在时以不同的方式工作。在我的顶部crontab,我将DISPLAY变量设置为:0即使它还不存在。无论您是否有显示器crontab,以开头的脚本@reboot都会启动。这将允许您动态检测您的显示何时进入和进入同一脚本。

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


dar*_*nir 6

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

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