外观
配置即代码:把系统设置写下来
一台用了两年的 Mac 上有几百处你手工调过的设置。换机器、重装系统、或者只是想知道「我当初为什么把这个关了」的时候,这些改动全部无从查起。
解决办法是把改动记下来——不是记在笔记里,而是记成可以重新执行的命令。这一篇讲怎么做,也讲这套方法做不到什么。
开始之前
需要能在终端执行命令。本文会修改偏好设置,每一处都给出了恢复方式。
先说清楚边界,免得期望落空:macOS 的系统设置不是全部都能用命令行控制的。有相当一部分只能手工点,还有一些改了之后需要注销或重启才生效。这套方法能覆盖大约一半的常见改动,剩下的要靠一份人读的清单。
defaults 是什么
macOS 的偏好设置存在一批 plist 文件里,defaults 是读写它们的命令行工具。
看某个应用的全部设置:
sh
defaults read com.apple.dockread 后面跟的是域(domain),通常是应用的 bundle ID。输出是这个应用的所有偏好项。
读某一项:
sh
defaults read com.apple.dock autohide写入:
sh
defaults write com.apple.dock autohide -bool truewrite 后面依次是域、键名、类型和值。类型常见的有 -bool(真假)、-int(整数)、-float(小数)、-string(文本)。类型写错会导致设置不生效,而且通常没有报错。
删除一项,让它回到系统默认:
sh
defaults delete com.apple.dock autohide这是最可靠的「恢复原状」方式——比记住原来的值再写回去更干净,因为你删掉之后系统用的就是真正的默认值。
很多改动需要重启对应的进程才能看到效果:
sh
killall Dockkillall 按名字结束进程,Dock 会自动重启。这不会丢失任何东西。
怎么找到键名
这是最实际的问题:你想改某个设置,但不知道它对应哪个键。
可靠的办法是对比法:
sh
defaults read > /tmp/before.txt不带域名时 read 导出全部设置。然后去图形界面里改那一项,再:
sh
defaults read > /tmp/after.txt
diff /tmp/before.txt /tmp/after.txtdiff 比较两个文件,输出差异。改动对应的键名就在其中。
这个方法比搜索网上的命令可靠得多——网上的很多命令来自多年前的 macOS,键名可能早已失效,执行了也不报错,只是什么都没发生。
几个确实有用的例子
下面几条是相对稳定、并且效果明显的:
sh
# 显示所有文件扩展名
defaults write NSGlobalDomain AppleShowAllExtensions -bool true
# 访达默认以列表视图显示
defaults write com.apple.finder FXPreferredViewStyle -string "Nlsv"
# 截图保存为 PNG 并去掉窗口阴影
defaults write com.apple.screencapture type -string "png"
defaults write com.apple.screencapture disable-shadow -bool true
killall Finder SystemUIServerNSGlobalDomain 是全局域,影响所有应用。行首的 # 是注释。
每一条都要加注释说明它干什么——半年后你会忘记,而一串没有注释的 defaults write 是最难维护的东西。
在网络卷上禁止写 .DS_Store 的那一条在NAS 与网络共享里有说明,也属于这一类。
整理成一个脚本
把改动集中到一个文件里,例如 ~/dotfiles/macos-defaults.sh:
sh
#!/usr/bin/env bash
set -euo pipefail
# 显示所有文件扩展名(2026-01 添加,因为经常需要确认文件类型)
defaults write NSGlobalDomain AppleShowAllExtensions -bool true
# 截图存为 PNG(2026-01 添加,默认的 PNG 已经合适,此处仅为显式声明)
defaults write com.apple.screencapture type -string "png"
killall Finder
echo "完成。部分设置需要注销后重新登录才生效。"第一行 #!/usr/bin/env bash 指定用 bash 执行。第二行 set -euo pipefail 是安全设置:-e 出错就停、-u 用到未定义变量就报错、-o pipefail 管道中任一环节失败都算失败。没有这一行,脚本会在出错后继续往下跑,留下一个改了一半的状态。
赋予执行权限并运行:
sh
chmod +x ~/dotfiles/macos-defaults.sh
~/dotfiles/macos-defaults.sh把这个脚本放进你的 dotfiles 仓库,见dotfiles 管理。配合用 Brewfile 声明整机软件,一台新机器的大部分环境就能自动重建。
这套方法的边界
必须诚实地说明它做不到什么,否则你会在重装系统时发现事情不对:
| 能用命令搞定 | 只能手工 |
|---|---|
| 访达、Dock、截图等的多数选项 | 隐私授权(TCC 有意不允许脚本修改) |
| 键盘重复速度等全局设置 | Apple ID 登录与 iCloud 项目选择 |
| 部分第三方应用的偏好 | 触发式自动化、快捷指令的授权 |
| 开发工具的配置文件 | 需要指纹或密码确认的安全设置 |
第一行右侧值得强调:隐私授权不能用脚本恢复,这是设计使然。如果可以,恶意软件也就可以。所以重装之后总有一批授权要手工点一遍——把需要授权的应用列成清单,比试图自动化它更实际。
还有一类陷阱:某些设置改完之后,图形界面里显示的仍是旧值,直到注销重新登录。这时不要反复执行命令,先注销一次再确认。
别抄不懂的配置
网上有很多几百行的 macos-defaults.sh,里面混杂着不同年代的设置。直接执行的风险是:
- 大量键名对应的是旧版 macOS,执行了没有任何效果,但你以为生效了。
- 少数会改变你并不想改的行为,而你不知道是哪一行导致的。
- 出问题时无法定位——你没法逐条验证几百行。
正确用法是当参考而不是当脚本:看到一条感兴趣的,先单独执行,确认效果,写上注释,再加进自己的文件。一次加三五条,用几天没问题再加下一批。
检查结果
sh
defaults read NSGlobalDomain AppleShowAllExtensions输出 1 表示已开启。
sh
defaults domains | tr ',' '\n' | wc -ldomains 列出所有存在偏好设置的域,tr ',' '\n' 把逗号换成换行(因为输出是逗号分隔的一长行),wc -l 数行数。这个数字会让你直观感受到系统里有多少配置——通常是几百个。
动手练习
完整走一遍「发现键名 → 写下来 → 回退」:
- 执行
defaults read com.apple.dock > /tmp/dock-before.txt。 - 在「系统设置 → 桌面与程序坞」里改一项(比如把程序坞位置改到左侧)。
- 执行
defaults read com.apple.dock > /tmp/dock-after.txt,再diff /tmp/dock-before.txt /tmp/dock-after.txt,找出对应的键名。 - 在界面上改回原样,用命令行执行同样的改动,加上
killall Dock,确认效果一致。 - 用
defaults delete删掉那个键,确认回到默认状态。 - 把这条命令连同注释写进
~/dotfiles/macos-defaults.sh,或者决定不要它。
成功标准是第 3 步——你能自己找出任意一项设置对应的键名,不依赖搜索。这个能力比记住几十条现成命令有用得多,因为它在 macOS 更新之后仍然有效。