Macos 如何在OSX上解析'defaults read'的输出?
如何解析OS XMacos 如何在OSX上解析'defaults read'的输出?,macos,git,plist,defaults,Macos,Git,Plist,Defaults,如何解析OS Xdefaults readterminal命令的输出 它似乎输出“旧”下一步plist格式;看起来像: { "Apple Global Domain" = { AppleAntiAliasingThreshold = 4; AppleCollationOrder = root; 我尝试将输出写入一个文件并使用plutil进行转换,但遇到了以下问题: > defaults read > defaults.txt > plutil -con
defaults read
terminal命令的输出
它似乎输出“旧”下一步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中,以便在应用更改后保留一条记录作为更改设置和diff,但
defaults read
中的序列化似乎不是“行顺序稳定的”:字典不会以一致的顺序转储它们的键,从而导致大量的噪音。如果我可以解析默认值读取
,我就可以通过顺序一致的序列化程序将数据输出。你真是个幸运的家伙,就在几天前,有人在PyPi上发布了NeXTSTEP plist格式的解析器——
.这里的脚本不是解析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
等等。您尝试过默认导出吗? 这将输出一个二进制文件,然后可以使用plutil将该文件转换为.plist,可以转换为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-
表示:将结果打印到标准输出$f
是plist格式的输入文件您在读什么?@特洛伊木马用于默认读取
终端命令的输出(我使用的是OS X 10.8和10.9)。它转储您的首选项,但看起来像是旧的NeXTSTEP plist格式,而不是像xml这样易于解析的格式。我将对问题进行编辑,以使其更清楚。我需要相同的功能来解析“/System/Library/CoreServices/pbs-dump_pboard”的输出事实上,该格式非常接近JSON,只对数组使用()而不是[],并以“;”结尾每个项,即使它是其级别中的最后一项。因此,也许可以使用现有的JSON解析器源代码,对其稍加修改,使其能够阅读本文。感谢您的建议。我尝试了nsplist
库,但它吐在我从默认读取的输出上
。。。我的猜测是,这个命令正在以一种看起来像NeXTSTEP plist但并不完全一致的方式格式化它的响应(因此苹果自己的plutil
也失败了)。