defaults

Všechny sofistikovanější aplikace potřebují nějaký způsob, jak si zapamatovat interní nastavení, které obnoví při příštím spuštění. Mohou to udělat po svém a vytvořit si někde na disku konfigurační soubor s vlastními pravidly pro jeho vnitřní podobu.
V unixových systémech stačí letmý pohled do adresáře /etc. Každý soubor bude pravděpodobně vypadat jinak. Microsoftí Windows na to jdou diametrálně odlišnou cestou binární databáze (registry). Co OS X?

Application defaults

Desítkové šelmy zdědily od svého předchůdce (NeXTStepu) specifický systém pro ukládání nastavení postavený na identifikátoru aplikace a mapování datových typů CoreFoundation na jejich ekvivalenty v Property Listu. Každá správná aplikace pro OS X by měla mít svůj unikátní identifikátor ve tvaru obráceného DNS záznamu domény pod kontrolou vývojáře. Pro svůj program mohu použít identifikátor cz.osxadmin.mujprogram, protože je to momentálně moje doména 🙂 Aplikace má možnost využít svojí doménu pro uložení nějakých dat na disk. Odpadají trable se strukturou souboru + snadné načítání a ukládání zajistí CF API.

Programování v CF frameworku přenechám jiným a v tomto postu se zaměřím na práci s aplikačním nastavením pomocí nástroje defaults. Většina mírně pokročilých uživatelů Maca se s ním pravděpodobně již někdy setkala, když ho copy&paste vkládala do terminálu, aby změnila nějaké skryté nastavení systému.

Domény a data

defaults domains | tr ' ' '\n'
Vypíše všechny domény se kterými lze přímo manipulovat.

defaultsdomains

defaults read com.apple.Finder
Zobrazí zformátovaný (o něco čitelenější než xml) obsah konfiguračního souboru pro Finder. Tato doména odpovídá souboru com.apple.Finder.plist v knihovně uživatele.

defaultsrad

Plisty s nastavením programů najdete v ~/Library/Preferences/ nebo ~/Library/Containers pro sandboxované aplikace.

Globální doména

Vedle domén jednotlivých aplikací existuje i společný globální prostor. Fyzicky se tato data nachází v souboru ~/Library/Preferences/.GlobalPreferences.plist

Při práci s globálním prostorem je potřeba defaults dodat upřsňující argument. Možností zápisu je více: -g | -globalDomain | NSGlobalDomain.
Příklad: defaults read NSGlobalDomain.

Local Library

Vedle nastavení konkrétního uživatele je tu ještě lokální knihovna společná pro všechny /Library (a mnoho dalších míst, kde potkáte property list). Pokud chcete využít defaults k upravení plistu v ní, musíte uvést celou cestu k souboru ->
defaults read /Library/Preferences/com.apple.security.plist
defaults read /Library/Preferences/.GlobalPreferences.plist
(Globální prostor pro všechny uživatele)

Číst

defaults read doména|plist – komletní obsah domény/plistu
defaults read doména|plist klíč – konkrétní informace podle klíče
defaults read-typu doména|plist klíč – datový typ

defaultsraed

Zapsat

defaults write doména|plist klíč data
Defaultně jsou data brána jako řetězec. Jiný datový typ je nutné specifikovat přípanačem:
-string -data -int -float -bool -date -array -dict
Do existujících polí a slovníků lze přidat další položky přepínači:
-dict-add -array-add

defaultswrite

Smazat

defaults delete doména|plist – smaže doménu/plist. Samotný zůstane zachován, jeho obsah nikoliv.
defaults delete doména|plist klíč – smaže jen specifikovaný key-value pár.

Závěrem

defaults hraje důležitou roli v shell-skriptování pro OS X. Často může být potřeba vytáhnou z plistu nějakou hodnotu, na základě které se skript rozhodne, co bude dělat dál. Není vůbec na škodu pomocí defaults ukládat nastavení samotného skriptu (pokud je určen pouze pro OS X) a vyhnout se tak psaní funkcí pro parsování konfiguráku.

Zrada přichází, pokud chcete upravovat víceúrovňový plist (slovníky a pole zanořené v sobě). Na ty defaults nestačí a nezbývá než sáhnout po nástroji PlistBuddy.

Další inforamce v manuálové stránce -> man defaults

Bonus: Secrets

Uvnitř property listů různých systémových komponent často vývojáři “zapomněli” nastavovací proměnné, které nemají žádné přepínátko v GUI. Většinou jde o drobnosti, ale najde se tam mnoho vyloženě šikovných nastavení. Mezi moje oblíbené patří možnost vypnout otravnou animaci při otevření nového okna aplikace:
defaults write NSGlobalDomain NSAutomaticWindowAnimationsEnabled -bool NO
Uživatelé našli skrytých nastavení poměrně velké množství, proto přijde vhod aplikace Secrets v podobě panelu do System Preferences , která v nich umí vyhledávat…

defaultssecrets