最近我把它放到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 和xterm
X 上。
我在这里使用“通常”一词,因为像 GNU Screen 和 TMux 这样的应用程序似乎会混淆变量TERM
。
答案4
在普通的 bash 脚本中:if [[ $DISPLAY ]]
在同一台计算机上,$DISPLAY
将在终端模拟器中返回0:0
,但在真实终端中不会返回任何内容。这可以很容易地用CtrlAltF1vs进行测试CtrlAltF7。
bash
基于的条件如下$DISPLAY
所示:
if [[ $DISPLAY ]]; then
…
fi
在.profile
或.personal
:if xhost >& /dev/null
根据我的经验,在执行或扩展$DISPLAY
时尚未设置。对于这些情况,.profile
.personal
用户回答 cmevoli
服务最好:
if xhost >& /dev/null; then
fi