6

如何解析 OS Xdefaults read终端命令的输出?

它似乎输出“旧”的 NeXTSTEP plist 格式;看起来像的东西:

{
"Apple Global Domain" =     {
    AppleAntiAliasingThreshold = 4;
    AppleCollationOrder = root;

我尝试将输出写入文件并使用 转换plutil,但它窒息:

> defaults read > defaults.txt
> plutil -convert xml1 defaults.txt
2014-02-02 21:29:14.856 plutil[56896:707] CFPropertyListCreateFromXMLData(): Old-style
plist parser: missing semicolon in dictionary on line 10835. Parsing will be abandoned.
Break on _CFPropertyListMissingSemicolon to debug.
defaults.txt: Property List error: Unexpected character { at line 1 / JSON error: No
value for key in object around character 28.

你为什么问?

我想将默认值存储在 git 中,以便在应用更改后将记录作为更改设置和差异,但似乎序列化defaults read不是“行序稳定”:字典不会以一致的顺序转储其键, 造成巨大的噪音。如果我可以解析defaults read,然后我可以通过顺序一致的序列化程序将数据输出。

4

4 回答 4

3

你是个幸运的人,就在几天前,有人在 PyPi 上发布了 NeXTSTEP plist 格式的解析器 ——nsplist

于 2014-02-02T21:00:06.430 回答
2

plutil可以转换为 xml 或 json

#!/bin/bash
f='~/Library/Preferences/com.apple.LaunchServices/com.apple.launchservices.secure'
x="$(plutil -convert xml1 -o - "$f")"
j="$(plutil -convert json -o - "$f")"

-o -意思是:打印到stdout的结果
$f是plist格式的输入文件

于 2020-09-08T08:46:01.507 回答
1

下面是一个直接读取默认值的脚本,而不是解析 defaults 命令的输出:

#!/usr/bin/swift
import Foundation

var args = CommandLine.arguments
args.removeFirst()
if let suite = args.first, let defaults = UserDefaults(suiteName: suite) {
    args.removeFirst()
    if let keyPath = args.first, let value = defaults.value(forKeyPath: keyPath) {
        print(value)
    } else {
        print(defaults.dictionaryRepresentation())
    }
}

如果将其保存为名为dread,的文件,chmod +x dread则可以读取应用程序的默认值并将其打印出来,如下所示:

dread com.apple.dt.Xcode IDEApplicationwideBuildSettings

由于这是一本字典,您可以使用以下命令从该字典中读取其中一个键:

dread com.apple.dt.Xcode IDEApplicationwideBuildSettings.SYMROOT

等等。

于 2020-05-06T04:56:06.710 回答
0

你试过defaults export吗?这会输出一个二进制文件,然后可以使用 plutil 将其转换为 .plist

于 2020-05-11T22:45:57.637 回答