跳转到内容

配置即代码:把系统设置写下来 ​

一台用了两年的 Mac 上有几百处你手工调过的设置。换机器、重装系统、或者只是想知道「我当初为什么把这个关了」的时候,这些改动全部无从查起。

解决办法是把改动记下来——不是记在笔记里,而是记成可以重新执行的命令。这一篇讲怎么做,也讲这套方法做不到什么。

开始之前 ​

需要能在终端执行命令。本文会修改偏好设置,每一处都给出了恢复方式。

先说清楚边界,免得期望落空:macOS 的系统设置不是全部都能用命令行控制的。有相当一部分只能手工点,还有一些改了之后需要注销或重启才生效。这套方法能覆盖大约一半的常见改动,剩下的要靠一份人读的清单。

defaults 是什么 ​

macOS 的偏好设置存在一批 plist 文件里,defaults 是读写它们的命令行工具。

看某个应用的全部设置:

sh
defaults read com.apple.dock

read 后面跟的是域(domain),通常是应用的 bundle ID。输出是这个应用的所有偏好项。

读某一项:

sh
defaults read com.apple.dock autohide

写入:

sh
defaults write com.apple.dock autohide -bool true

write 后面依次是域、键名、类型和值。类型常见的有 -bool(真假)、-int(整数)、-float(小数)、-string(文本)。类型写错会导致设置不生效,而且通常没有报错。

删除一项,让它回到系统默认:

sh
defaults delete com.apple.dock autohide

这是最可靠的「恢复原状」方式——比记住原来的值再写回去更干净,因为你删掉之后系统用的就是真正的默认值。

很多改动需要重启对应的进程才能看到效果:

sh
killall Dock

killall 按名字结束进程,Dock 会自动重启。这不会丢失任何东西。

怎么找到键名 ​

这是最实际的问题:你想改某个设置,但不知道它对应哪个键。

可靠的办法是对比法:

sh
defaults read > /tmp/before.txt

不带域名时 read 导出全部设置。然后去图形界面里改那一项,再:

sh
defaults read > /tmp/after.txt
diff /tmp/before.txt /tmp/after.txt

diff 比较两个文件,输出差异。改动对应的键名就在其中。

这个方法比搜索网上的命令可靠得多——网上的很多命令来自多年前的 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 SystemUIServer

NSGlobalDomain 是全局域,影响所有应用。行首的 # 是注释。

每一条都要加注释说明它干什么——半年后你会忘记,而一串没有注释的 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 -l

domains 列出所有存在偏好设置的域,tr ',' '\n' 把逗号换成换行(因为输出是逗号分隔的一长行),wc -l 数行数。这个数字会让你直观感受到系统里有多少配置——通常是几百个。

动手练习 ​

完整走一遍「发现键名 → 写下来 → 回退」:

  1. 执行 defaults read com.apple.dock > /tmp/dock-before.txt。
  2. 在「系统设置 → 桌面与程序坞」里改一项(比如把程序坞位置改到左侧)。
  3. 执行 defaults read com.apple.dock > /tmp/dock-after.txt,再 diff /tmp/dock-before.txt /tmp/dock-after.txt,找出对应的键名。
  4. 在界面上改回原样,用命令行执行同样的改动,加上 killall Dock,确认效果一致。
  5. 用 defaults delete 删掉那个键,确认回到默认状态。
  6. 把这条命令连同注释写进 ~/dotfiles/macos-defaults.sh,或者决定不要它。

成功标准是第 3 步——你能自己找出任意一项设置对应的键名,不依赖搜索。这个能力比记住几十条现成命令有用得多,因为它在 macOS 更新之后仍然有效。

返回维护与调优