2014-04-23 15 views
14

Betrachten wir eine Präferenz plist mit einem dict, die ein Array enthält:Wie füge ich verschachtelten Arrays oder Dicts mit dem Befehl "defaults write" Werte hinzu?

Lassen Sie uns es schaffen:

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

es dann besser die Struktur zu sehen, lesen Sie zurück:

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

Nun, wie Ich füge anArray einen Wert mit dem Befehl defaults write hinzu?

Ich weiß, dass es den -array-add Typ zum Hinzufügen von Werten zu einem Array gibt, aber wie gebe ich den Schlüsselpfad zum Array-Element?

ich dies habe es versucht, aber das funktioniert nicht:

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

In der Tat muss ich einen Nicht-String-Typ hinzufügen, also muss ich auch in der Lage sein, die Art angeben, zum Beispiel -bool YES.

(Anmerkung: Ich kann nicht verwenden PlistBuddy noch plutil wie diese Live-Präferenzen zu beeinflussen braucht)

Antwort

2

Verwenden plutil und Ihr Leben wird besser sein. Standardwerte unterstützen keine Schlüsselpfade.

> 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 
     ); 
    }; 
} 

verwendete ich defaults read nur um zu beweisen, dass die erwarteten Eingänge gleich sind, aber Sie werden wahrscheinlich plutil -p ~/Library/Preferences/org.my.test.plist verwenden, um die Datei stattdessen, wenn Sie plutil mehr beginnen zu lesen.

+0

Das Problem mit dieser Lösung ist, dass es nicht mit Voreinstellungsdateien funktioniert, da diese seit 10.8 oder so zwischengespeichert werden, daher wird die Änderung der Dateien auf der Festplatte den Cache nicht entsprechend aktualisieren. Und ich muss dies mit Voreinstellungen tun ("User Defaults"). –