在 Mac 上的 UNIX 脚本中确定并使用分辨率作为变量

在 Mac 上的 UNIX 脚本中确定并使用分辨率作为变量

我正在将 NetRestore 映像部署到多种 Mac:MacBook、MacBook Pro、Mac Pro、iMac 和 Mac Mini。我有几个想要使用的自定义登录屏幕,但 10.10 之前的所有内容都要求您知道显示器分辨率,否则登录背景将无法正确显示。

有没有办法将此代码的输出用作一系列if/then语句的变量?

system_profiler SPDisplaysDataType |grep Resolution

正常输出如下

Resolution: 2560 x 1440
Resolution: 1920 x 1200
Resolution: 1920 x 1200

(如果您有三个显示器...我更喜欢使用第一个结果)。

我的目的是让脚本在将 Mac 绑定到 Active Directory 时运行(这必须手动完成),因此分辨率应该已经可用。它会选择正确的分辨率图像,然后将其复制到所需的位置。

或者是否有人知道如何创建自定义登录窗口背景和用户背景,以便在任何类型的 Mac 上以任何分辨率运行,就像在系统偏好设置中选择“适合屏幕”时操作系统所做的那样?

答案1

有很多方法可以做到这一点,但如果您只想坚持使用/主要使用 bash,这里有两种方法。

  • system_profiler有一个输出到 XML 的选项。使用此选项将输出放入变量或文件,例如,确保包含双引号:

    someVar="$(system_profiler SPDisplaysDataType -xml)"
    
  • 这将返回一个数组,_items其中_IODisplayEDID列出了显示名称_name和分辨率_IODisplayEDID

  • 如果你致力于/需要将其保留在 bash 中,那么 StackOverflow.com 上有一个很好的回应如何在 Bash 中解析 XML我不会重复讨论。但此时您应该考虑使用 XML 解析器链接 XMLStartlet 或xsltproc包含在 Xcode Dev Tools 中。

尽管如此,您仍然可以采用这种grep方式,但必须对输出的总长度以及您感兴趣的显示器上的“分辨率”位置做出一些假设。以下是基于我的 2 个显示系统的粗略测试:

  • 首先获取显示名称。为了考虑名称中的空格,您可以暂时重置 $IFS 以仅使用换行符,然后使用grep -A在“Displays”后获取 50 行(估计值),不是返回第一行并获取名称值,因为它们以:(需要做很多假设!

    IFStemp=${IFS}
    IFS=$'\n'
    var=($(system_profiler SPDisplaysDataType|grep -A 50 \ Displays|grep -v Displays|egrep ':$'))
    
  • 然后使用它来估计“分辨率”的位置。显然,您可以替换printf变量名,但我想显示输出。我过去常常sed修剪前导空格。

    for displayName in ${var[@]}; do
       printf '%s = %s\n' "${displayName%?}" "$(system_profiler SPDisplaysDataType|grep -A 3 "${displayName}"|grep Resolution|sed -e 's/^[[:space:]]*//g' -e 's/Resolution\:\ //g')"
    done
    
  • 现在重置你$IFS

    IFS=${IFStemp}
    unset IFStemp
    

以下是我得到的输出:

Color LCD = 2880 x 1800 Retina
DELL 2007WFP = 1920 x 1200 @ 60 Hz

相关内容