【问题标题】:How to detect availability of GUI in Bash/Shell?如何在 Bash/Shell 中检测 GUI 的可用性?
【发布时间】:2019-07-26 12:25:21
【问题描述】:

我正在用 NodeJS 编写 CLI。由于我可以使用 child_process 轻松运行 bash/shell 命令,因此我想知道最简单的跨平台方式来检测 bash/shell 中的 GUI 可用性。

谢谢!

【问题讨论】:

  • 如果您正在编写 CLI,为什么需要 GUI 可用性?
  • 因为如果 GUI 可用,我想启动一个替代的电子应用程序,它是 fency :D
  • 最好检查环境变量 DISPLAY 是否存在。不过,不确定它在 MacOS 上的检查是否 100% 可靠。
  • 确实,OSX 上不存在 DISPLAY 变量:/
  • 启动您的应用程序。如果有 GUI,它将运行。如果没有,它将以可预测的方式失败。如果您检测到这种可预测的方式,请进入 CLI 操作 - 否则会出错?

标签: linux bash macos shell user-interface


【解决方案1】:

检查环境中是否设置了DISPLAY。如果是,您有一个 Xserver 正在运行。如果没有,你不会。很确定 Wayland 也设置了它。

【讨论】:

  • 他也将其标记为 MacOS。除非安装了 Xquartz,否则不确定是否会设置 DISPLAY。
  • 我错过了。我也不确定。
【解决方案2】:

在 macOS 上,没有明显合适的方法可以从 shell 中检查这一点。有一种编程方式,我们可以使用解释语言来利用它。

这是一个输出三种状态之一的小脚本,Mac GUI、Mac 非 GUI 或 X11:

#!/bin/bash

check_macos_gui() {
  command -v swift >/dev/null && swift <(cat <<"EOF"
import Security
var attrs = SessionAttributeBits(rawValue:0)
let result = SessionGetInfo(callerSecuritySession, nil, &attrs)
exit((result == 0 && attrs.contains(.sessionHasGraphicAccess)) ? 0 : 1)
EOF
)
}

if [ "$(uname)" = "Darwin" ]; then
  if check_macos_gui; then
    echo "Mac GUI session"
  elif [ -n "$DISPLAY" ]; then
    echo "Mac X11 GUI session"
  else
    echo "Mac non-GUI session"
  fi
elif [ -n "$DISPLAY" ]; then
  echo "X11 GUI session"
fi

Mac 可以安装 X 服务器,在这种情况下,DISPLAY 被定义。但是,我不知道您的 Electron 应用程序是否可以在该配置中正常工作。所以,我单独检测了。

【讨论】:

  • 为什么是swift &lt;(cat &lt;&lt;"EOF" 而不是swift - &lt;&lt;"EOF"
  • @CharlesDuffy 如果它从标准输入而不是文件名参数接收输入,它的行为就好像它是交互式的,并且无论传递给exit() 的内容如何都以 0 状态退出。此外,它还会产生烦人的无关输出。
  • 我想知道我们是否有不同的版本。 swift - &lt;&lt;&lt;'import Security; exit(3)'; echo $? 根本不发出任何输出(在 echo 之前)并为我显示退出状态 3 —— 那是 Apple Swift 版本 4.2.1 (swiftlang-1000.11.42 clang-1000.11.45.1)我>
  • ...或者你上面提到的行为可能是没有明确的-指定标准输入?
  • 是的,明确的- 似乎有所作为。作为记录,我目前正在使用 Xcode 8 在 Sierra 上进行测试,因此:Apple Swift 版本 3.1 (swiftlang-802.0.51 clang-802.0.41).
【解决方案3】:

这是一个工作示例:

if [ x$DISPLAY != x ] ; then
  echo "GUI Enabled"

else
  echo "GUI Disabled"

fi

所有这些都是检查$DISPLAY 变量。

【讨论】:

    【解决方案4】:

    试试这个:

    echo $XDG_CURRENT_DESKTOP

    或者这个:

    echo $DESKTOP_SESSION

    【讨论】:

      猜你喜欢
      • 2011-03-13
      • 2019-01-07
      • 1970-01-01
      • 2015-03-05
      • 2011-10-17
      • 1970-01-01
      • 2012-04-12
      • 2019-05-02
      • 1970-01-01
      相关资源
      最近更新 更多