在Mac上的UNIX脚本中确定并使用解析度作为变量


2

我正在将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上以任何分辨率工作都具有好主意,就像在“系统偏好设置”中选择“适合屏幕”时OS一样?

Answers:


2

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

  • system_profiler可以选择输出到XML。使用此命令将输出放置到变量或文件中,例如,确保包含双引号:

    someVar="$(system_profiler SPDisplaysDataType -xml)"
    
  • 这将返回一个_items名为的数组,_IODisplayEDID该数组将显示名称列为_name,将分辨率列为_IODisplayEDID

  • 如果您承诺/要求将其保留在bash中,那么这在StackOverflow.com上是一个很好的答复,内容涉及如何解析bash中的XML,而我不会对其进行重新哈希处理。但是在这一点上,您应该考虑使用XML解析器链接XMLStartlet或xsltprocXcode开发工具中包含的XMLStartlet 。

综上所述,您仍然可以grep沿途行事,但必须对输出的总长度以及您对感兴趣的显示器的“分辨率”的位置进行一些假设。这是基于我的2显示器系统的粗略测试:

  • 首先获取显示名称。为了说明在名称空间,可以暂时重置$ IFS只使用一个换行符,然后使用grep -A“显示”后能得到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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.