MacOS 文件默认打开方式由Launch Services数据库控制,需用终端指令defaults write配合UTI和Bundle ID精准设置,再执行lsregister -kill刷新生效。
macos 的文件默认打开方式不是靠图形界面“点一点”就全局生效的,它背后由 launch services 数据库驱动,真正起作用的是 com.apple.launchservices 中的 lshandlers 规则。终端指令是唯一能精准、批量、持久修改系统级关联的方法。
查清文件类型与应用标识符
改之前必须知道两个关键信息:目标文件的真实类型(UTI)和目标应用的 Bundle ID。图形界面看不到这些,但终端可以快速获取:
- 查文件 UTI:
mdls -name kMDItemContentTypeTree 文件名(例如mdls -name kMDItemContentTypeTree note.txt可能返回public.plain-text) - 查应用 Bundle ID:
osascript -e 'id of app "App名称"'(例如osascript -e 'id of app "VS Code"'返回com.microsoft.VSCode)
用 defaults write 写入全局关联规则
这一步把新的打开规则写进当前用户的 Launch Services 数据库,不加 sudo,否则写到 root 用户下无效:
- 命令格式:
defaults write com.apple.LaunchServices LSHandlers -array-add '{LSHandlerContentType=UTI值;LSHandlerRoleAll=BundleID值;}' - 示例(让所有纯文本文件默认用 VS Code 打开):
defaults write com.apple.LaunchServices LSHandlers -array-add '{LSHandlerContentType=public.plain-text;LSHandlerRoleAll=com.microsoft.VSCode;}' - 可重复执行多条,添加多个规则;如需覆盖已有规则,先用
defaults delete com.apple.LaunchServices LSHandlers清空再重写
刷新 Launch Services 并验证生效
写入只是存进 plist,必须强制重建注册表才能让 Finder 和双击行为识别新规则:
- 执行刷新:
/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -kill -r -domain local -domain system -domain user - 重启 Finder(非必须但推荐):
killall Finder - 验证是否成功:找一个对应扩展名的文件,右键 > “显示简介”,看“打开方式”下拉菜单顶部是否已显示目标应用;或终端运行
lsregister -dump | grep -A 2 -B 2 "你的UTI"查看注册记录
遇到不生效时的排查与补救
常见失败不是命令写错,而是系统限制或缓存残留:
- 某些 UTI(如
public.html)被 Safari 锁定,无法覆盖 —— 改用更具体的 UTI,比如用mdls查出实际值dyn.ah62d4rv4ge800c5再写入 - 第三方应用未签名或未沙盒化,Bundle ID 可能被拒 —— 尝试手动注册该 App:
lsregister -f /Applications/YourApp.app - 怀疑缓存污染?用 Onyx 或直接运行
lsregister -kill彻底重建整个数据库 - 想一键恢复所有默认关联?没有官方“重置按钮”,但可删掉数据库后重启:
rm ~/Library/Preferences/com.apple.LaunchServices.plist,然后重启系统(会重建为出厂默认)


















