我正在将 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