如何使用"defaults write"命令将值添加到嵌套数组或dicts?

Tho*_*ann 17 macos defaults

考虑一个带有包含数组的dict的首选项plist:

让我们创建它:

defaults write org.my.test '{aDict = {anArray = ();};}'
Run Code Online (Sandbox Code Playgroud)

然后回过头来看看结构更好:

$defaults read org.my.test
{
    aDict = {
        anArray = (
        );
    };
}
Run Code Online (Sandbox Code Playgroud)

现在,如何anArray使用defaults write命令添加值?

我知道有一种-array-add类型可以为数组添加值,但是如何指定数组元素的键路径?

我试过这个,但这不起作用:

defaults write org.my.test aDict.anArray -array-add "a value"
Run Code Online (Sandbox Code Playgroud)

实际上,我需要添加一个非字符串类型,所以我还需要能够指定类型,例如-bool YES.

(注:我不能使用PlistBuddy也不plutil,因为这需要会影响到实际偏好)

Liy*_*ang 7

使用plutil,您的生活会更美好。默认值不支持键路径。

> defaults write org.my.test '{aDict = {anArray = ();};}'

> defaults read org.my.test
{
    aDict =     {
        anArray =         (
        );
    };
}

> plutil -insert aDict.anArray.0 -bool YES ~/Library/Preferences/org.my.test.plist

> defaults read org.my.test
{
    aDict =     {
        anArray =         (
            1
        );
    };
}
Run Code Online (Sandbox Code Playgroud)

我过去defaults read只是为了证明预期的输入是相同的,但是plutil -p ~/Library/Preferences/org.my.test.plist如果您开始使用plutil更多内容,您可能会改为使用读取文件。

  • 此解决方案的问题在于它不适用于首选项文件,因为这些文件从 10.8 左右开始缓存,因此修改磁盘上的文件不会相应地更新缓存。我需要使用首选项(“用户默认值”)来做到这一点。 (3认同)
  • @PatMyron 它由守护进程 `cfprefsd` 缓存在内存中。您可以强制退出它以刷新其缓存,但这不是我想要走的路。 (3认同)