săptămâna trecută, colegul Macadmin Kyle Crawford a descoperit că pe macOS High Sierra defaults
va șterge un fișier de listă de proprietăți cu sintaxă plist/XML nevalidă, chiar și atunci când încercați doar să citiți date. Erik Holtham are un bug OpenRadar mai detaliat.
Patrik Wardle a găsit codul relevant, care șterge fișierul atunci când nu se validează.
acest lucru este rău. Mulțumesc tuturor celor implicați pentru găsirea, documentarea și împărtășirea acestui lucru.
acesta este un comportament nou în High Sierra. Nu sunt încă sigur ce versiune a High Sierra acest nou comportament a fost introdus. Comportamentul are sens în contextul unei aplicații care încearcă să citească un fișier de setări, dar instrumentul defaults
ștergerea fișierelor arbitrare este, desigur, periculos.
Actualizare: acest comportament a fost stabilit în 10.13.4. Cu toate acestea, este încă o bună practică să evitați
defaults
pentru orice altceva decât fișierele de preferințe reale.
ce să fac?
ca de obicei, nu intrați în panică. Acest lucru va afecta doar Mac-urile care rulează High Sierra și fișierele corupte sau rupte. Cu toate acestea, dacă aveți un script care indică accidental comanda defaults
la un alt fișier, acesta va șterge acest lucru. Deci, trebuie să-l utilizați cu grijă.
este probabil o bună practică să verificați un fișier înainte de a încerca să îl modificați cu comanda defaults
într-un script cu comanda plutil
:
if ! plutil -lint path/to/file.plist; then echo "broken plist" exit 1else defaults path/to/file …fi
alternative la valorile implicite
alternativ, puteți și ar trebui să utilizați plutil
sau PlistBuddy
pentru a citi și modifica fișierele listei de proprietăți.
Aflați mai multe despre
plutil
,PlistBuddy
și alte instrumente pentru a citi și scrie liste de proprietăți în cartea mea: „Liste de proprietăți, preferințe și profiluri pentru administratorii Apple”
plutil
din păcate, nu este foarte util să citiți o singură valoare dintr-un fișier listă de proprietăți. Verbul extract
va arăta orice valoare ca plist propriu. Comanda plutil
este utilă pentru a edita fișierele plist existente. (Citiți detalii despre comanda plutil
.)
PlistBuddy
, cu toate acestea, este foarte util atât pentru citirea unei valori de scriere într-un fișier listă de proprietăți:
$ /usr/libexec/PlistBuddy berry.plist -c "print size"$ /usr/libexec/PlistBuddy berry.plist -c "set size enormous"
PlistBuddy
are avantajul suplimentar de a permite adăugarea sau editarea valorilor imbricate adânc în dict
sau array
structuri.
puteți obține mai multe informații despre PlistBuddy
în pagina sa de manual sau în cartea mea.
modul interactiv al PlistBuddy
este, de asemenea, foarte util.
deci comanda defaults este moartă?
nr.
Apple ne-a avertizat să nu folosim defaults
pentru editarea și analizarea fișierelor listei de proprietăți generice de ceva timp în pagina man a comenzii defaults
:
avertisment: comanda defaults va fi modificată într-o versiune majoră viitoare pentru a funcționa numai pe domenii preferințe. Utilitățile generale de manipulare plist vor fi pliate într-un alt program de linie de comandă.
după cum afirmă acest avertisment, instrumentul defaults
citește și scrie date în fișiere plist prin sistemul de preferințe macOS. Acest lucru are avantajul că instrumentul primește (și modifică) valoarea curentă, indiferent dacă este memorată în memorie sau nu. Atunci când o aplicație este de ascultare pentru notificări că o preferință sa schimbat (nu mulți fac), atunci acesta va fi notificat.
fișierele pentru domeniile preferențiale sunt de obicei stocate în /Library/Preferences/
, ~/Library/Preferences
sau subfolderele lor ByHost
. Aplicațiile Sandboxed vor avea fișierele plist preferate în containerul lor.
există, totuși, multe alte fișiere care sunt fișiere de listă de proprietăți care nu fac parte din Sistemul implicit al utilizatorului: launchd
fișiere, profiluri de configurare și rețete AutoPkg pentru a numi doar câteva.
administratorii Mac folosesc în mod obișnuit instrumentul defaults
, în ciuda avertismentului Apple, pentru a crea, citi și edita fișiere plist generice. Așa cum am menționat mai sus, plutil
, PlistBuddy
sau manipularea directă prin Obj-C, Python sau Swift, sunt alegeri mai bune pentru fișierele plist generice.