如何使用“defaults write”命令向嵌套数组或字典添加值?

Posted

技术标签:

【中文标题】如何使用“defaults write”命令向嵌套数组或字典添加值?【英文标题】:How do I add values to nested arrays or dicts using the "defaults write" command? 【发布时间】:2014-04-23 19:26:45 【问题描述】:

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

让我们创建它:

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

然后将其读回以更好地查看结构:

$defaults read org.my.test

    aDict = 
        anArray = (
        );
    ;

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

我知道有-array-add 类型用于向数组添加值,但是如何指定数组元素的键路径?

这个我试过了,但是不行:

defaults write org.my.test aDict.anArray -array-add "a value"

其实我需要添加一个非字符串类型,所以我还需要能够指定类型,e.g. -bool YES.

(注意:我不能使用 PlistBuddyplutil 因为这需要影响实时偏好)

【问题讨论】:

我自己刚碰到这个。我想知道您是否找到任何也支持缓存首选项的解决方案 【参考方案1】:

使用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
        );
    ;

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

【讨论】:

这个解决方案的问题是它不适用于首选项文件,因为这些文件是从 10.8 左右开始缓存的,因此修改磁盘上的文件不会相应地更新缓存。我需要使用首选项(“用户默认值”)来做到这一点。 @ThomasTempelmann 你知道缓存在哪里吗?如果我能找到它,考虑删除缓存使其失效,以便它必须检查原始文件 @PatMyron 它由守护进程cfprefsd 缓存在内存中。您可以强制退出它以刷新其缓存,但这不是我想要的路径。

以上是关于如何使用“defaults write”命令向嵌套数组或字典添加值?的主要内容,如果未能解决你的问题,请参考以下文章

如何将嵌套字段添加到我的 BigQuery 表架构?

无法在嵌套循环中使用 pandas 附加更大的数据帧。如何更改为 numpy 向量化?

如何向量化嵌套循环

如何向嵌套在折叠工具栏中的 ImageView 添加渐变

如何使用 python argparse 解析多个嵌套的子命令?

向 Spark DataFrame 添加嵌套列