article_image

在策划第三期会员栏目时,团队提议几位主笔都来写写自己的 Setup——就是那些拿到新电脑后必做的事情,不做的话,好像连电脑都不会用了。

看到这个选题,我顿时感到肚中空空如也,无从下笔,三揖三让之后仍然没有写出什么东西。原因很简单,凡是电脑上的痛点,我倾向于用第三方软件甚至硬件解决,而很少会改动系统设置,因为我对无法控制的东西都保持谨慎。1

痛点没什么好说,但痒点确实存在,那就是系统外观、Dock、菜单栏、LaunchPad 等细节设置,加之 Apple 近年来喜欢把系统调得更难用一些——我知道很多 Power User 拿到新电脑后,必定会把 Dock 的位置换到侧边而非底部——留默认设置一命也能相安无事,但有机会的话,还是希望能够把当前设置迁移到新电脑上。传统思路是直接迁移整个系统,或者乞援第三方工具,这些操作都是在黑箱(Black Box)中进行的,我完全不放心。我只想保留一些使用习惯,让新电脑看上去顺眼一点,干嘛一上来就要冒着把电脑弄瘫痪的风险!2

其实,相对一部分系统设置可以通过脚本来控制。我不需要为了平息几个痒点而跑去接受开颅手术,想保留哪些系统设置,把它们写成脚本,在新电脑上跑一跑就可以了。本文以 Dock 设置为例,分享一下系统设置脚本化的思路。本文内容已经在会员栏目中有所涉及,本篇为背后思路的完整版本。

脚本胜在何处

先来看一下脚本的运行效果。我不知道您使用什么编辑器,但每一台电脑都有脚本编辑器,可以复制下面的代码进去,直接运行:

tell application "System Events"
    -- 开启放大镜效果
    set the magnification of the dock preferences to true
    -- 选用缩放动画
    set the minimize effect of the dock preferences to scale
    -- 自动隐藏 Dock
    set the autohide of the dock preferences to true
    -- 在 Dock 上显示指示器
    set the show indicators of the dock preferences to true
    -- 不在 Dock 上显示最近项目
    set the show recents of the dock preferences to false
end tell

正如 -- 开头的注释所言,以上代码会调整系统设置,自动隐藏 Dock、隐藏最近项目、显示指示器(就是软件下方的小白点),等等。再打开系统设置看看,以上五处已经被修改了。

Alt text
Dock 设置

前述操作的意义何在?相比现成的备份工具或迁移助手,自己写脚本似乎是一个非常愚蠢的选择,像极了哪些放着时髦电脑不用、自己绘制电路板的 Nerd。

事实完全不是这样。如果现成的工具足够好用,显然我们没有必要自己再折腾;就像一个年轻时浑身机油、嗜机车如命的家伙,赶路时也不介意坐计程车。可惜,现有的工具并不那么好用,它们只是把系统设置一股脑儿转移到新机器上,连毛带血囫囵吞。许多人有从零开始一步一步设置新电脑的习惯,部分原因就是不想把旧电脑里的垃圾带过去。

而把系统设置脚本化则不然,它至少有以下三个好处:

  1. 有的放矢。只有你明文写下的地方会被修改,没写进脚本的就保持原样,这就避免了整体迁移造成的泥沙俱下。我有个老友,贪方便,喜欢用系统迁移助手,结果有个 flash 残留文件像幽灵一样跟了他十年,好在只是垃圾而不是病毒;至于有没有病毒,像他这样整个儿搬迁数据,我就无从知晓了。
  2. 改动留痕。既然所有改动都写成了脚本,那就有据可循,设置完成后如果发现哪里不对劲、有 bug,或者第三方软件死活运行不了,就可以检查一下哪些地方被修改了,据此排查问题。换言之,脚本是可逆的。
  3. 随意分享。这是脚本最容易被忽略的优点。自己电脑的配置,好像一套穿搭,断然不能分享给别人,不仅送的人胆战心惊,接受的人恐怕也会嫌弃。但脚本则不然,它不涉及任何敏感信息,只是对系统的细节调整,完全可以分享给别人;而下载的人如果对某个设置不感冒,那么删掉那一句就好,其他脚本仍然可以照常运行。

总之,将常用设置脚本化,不仅能够自己掌控系统设置,也方便日后查错,还可与他人共享。在传统方法无法照亮的阴影角落,往往就是脚本发光发热之处。

如何自己编写更多脚本

用脚本配置 macOS 的主要方法有两种,即 AppleScript 和 Shell,它们的语法都很简单,现成资源也比较丰富。你可以试着把想要改动的设置加上 AppleScriptcommand line,很容易看到网友在讨论它们,而且一般都有成熟方案。

常规设置:AppleScript

我撰写系统设置脚本的初衷,只是想保留诸如界面设置、明暗主题、Dock 外观等细节,这些东西往往改了也无害,不改也不是大碍,这就是前文所谓的痒点。这些设置改错也没有什么危害,很适合拿来练手。

具体有那些设置可以脚本化呢?可以打开 Script Editor(脚本编辑器),按下 ‌⇧Shift-⌘Command-O 打开 AppleScript 词典,然后检查“System Events”的词条。

Alt text
查看 System Events 的词典内容

System Events 涉及大量系统设置,尽管不是全部,但我想要的界面设置几乎都在其中。下图展示了 Dock 相关的各种属性及其参数,定睛一看,不难发现它系统设置中的图形界面基本是一一对应。

Alt text
AppleScript 词典

以自动显示、隐藏 Dock 为例,查询词典后可知,把“the autohide of the dock preferences”设置成“true”即可,据此可以写出如下代码:

tell application "System Events"
    set the autohide of the dock preferences to true
end tell

除了“the autohide of the dock preferences”和“true”,其他都是几乎不需要改动的代码模板:

tell application "System Events"
    set A to B
end tell

所谓的系统设置脚本化,其实就是一系列的“set A to B”,比如把自动隐藏打开,把指示器开启,把动画效果设置成某某样式,等等。照着 AppleScript 词典,可以很快写出个性化的设置脚本。

非常规设置:Shell

并非所有系统设置都可以通过图形化界面界面完成,也并非所有设置都写在 AppleScript 词典中。一些非常偏僻的设置,一般只能用 Shell 脚本完成。相信不少读者都在网上见过 defaults write 开头的“神秘代码”,往 Terminal(终端)里面一粘,然后一敲回车,电脑马上就坏了变样了。

下面这段经典的代码用于改变 LaunchPad 图标数量,可以更充分地利用大屏幕空间,在一个屏幕上摆下 56 个软件图标(macOS 默认的图标数量比 iPadOS 还少,这实在说不过去)。

defaults write com.apple.dock springboard-columns -int 8; defaults write com.apple.dock springboard-rows -int 7; defaults write com.apple.dock ResetLaunchPad -bool TRUE; killall Dock
Alt text
改变 LaunchPad 图标数量上限

类似命令散见于江湖,有人 收集了一批,可供您自己挑选3,但在使用前请自行查阅每条命令的用途和后果,并建议准备好恢复默认设置的命令。通常去 Stackoverflow 上问一问,就能看到调整设置和还原设置的成堆命令。

这些命令同样可以写成脚本,装新机的时候整体运行一下,麻瓜的玩具旋即变成魔法师的利器(至少看起来是这样)。与 AppleScript 类似,把 Shell 命令编排成脚本,也有可控、可回溯、易分享等优点。

把 AppleScript 和 Shell 脚本合二为一

就调整系统设置而言,AppleScript 脚本和 Shell 命令在本质上并无差别,有些功能还有所交叉(比如在 Dock 上显示指示器)。显然应当把它们写进同一份脚本文件,而不是各行其是。

管见以为,把 AppleScript 整合进 Shell 更为妥当,尽管反过来在技术上毫无困难。盖 Shell 不仅能够调整系统设置,还可以批量安装第三方应用程序(通过 HomeBrew)或者从外部磁盘恢复备份文件,完全能够写出一个全面的装机脚本,而调整系统设置其实只是其中一环;而 AppleScript 则很难应付复杂的软件安装或数据备份。

确定把 AppleScript 融入 Shell 的方向后,就可以切入代码细节。调整系统设置的 AppleScript 脚本都比较简短,为了鲁棒起见,还可以在前文基础上进一步简化语法,把一项设置写成一句话:

osascript -e 'tell application "System Events" to set the autohide of the dock preferences to true'

上面这句话就是自动隐藏 Dock 栏的意思。句子可以拆成两部分,外面的是 osascript -e '',表示调用 osascript 来运行 AppleScript;而单引号 '' 里面的就是 AppleScript 语句。为了把完整的 AppleScript 代码塞进同一行,我在单引号中选用了更简单的 AppleScript 写法:

tell application "System Events" to set the autohide of the dock preferences to true

以上句式简化了 end tell,避开了 Shell 命令中的换行问题。您需要修改的地方和直接编写 AppleScript 时一样,仍然是围绕 set A to B 改代码。待 AppleScript 都转写为 Shell 命令形式,就可以把它们统一粘贴到 Shell 脚本中。

Alt text
把 AppleScript 脚本融入 Shell 脚本

  1. 比如说,有些老鸟会告诉你,把防火墙打开可以“优化” macOS,但他们不会告诉你从此 AirDrop 就报废了,直到你尝试所有手段都无效后,才依稀想起所有问题都出现在改动系统设置之后。改动系统设置不是不行,但必须知道自己在做什么,而直接改动系统设置很难留下操作记录,因此非常危险。出于同一个原则,我认为我能够掌握的只有赤裸裸的文件,隐藏在时髦软件背后的数据就不算是我的,因此装系统对我来说不过就是把一堆文件复制粘贴过去,这也是我对装机选题“无话可说”的原因。
  2. 一个著名的设置备份工具是 mackup,你只要看看那几百个失败者提的 issues,就知道为何我不用这类软件了。
  3. 使用前务必查看每一条命令的功能解释,如有需要,可以配合我 这个 翻译方法。

author_avatar

Lawyer, macOS/iOS Automation Amateur