The /usr/bin/defaults command gives us basic command line access to the Mac OS X preferences system. I say ‘basic’ because it provides no facility for directly operating on any keys / values that are not at the top of the heirarchy. For example:
{8} andre@werk [~] % defaults read com.apple.finder ComputerOptions { ComputerListViewColumnFlags = 1; ComputerSidebarWidth = 121; ComputerToolbarVisible = 0; ComputerUseCustomIconViewOptions = 1; ComputerUseCustomListViewOptions = 1; ComputerViewHeight = 385; ComputerViewStyle = clmv; ComputerWindowBounds = {bottom = 726; left = 1589; right = 2277; top = 341; }; }
The ComputerOptions key contains not a string or an integer, but a dict (dictionary). Note that this is different from a ‘top level’ key which is a simple key / value relationship, such as:
{9} andre@werk [~] % defaults read com.apple.finder AppleShowAllFiles OFF
So, what do you do when you want to change the value of, for example, the ComputerToolbarVisible attribute in the ComputerOptions dict? With /usr/bin/defaults, you’d have to read out the entire dictionary, make the change in some other mutable environment, then load the whole ComputerOptions dict back in as a plist. It works, but there’s an easier way, using a tool that’s already on your system: PlistBuddy. You’ll find this in several apple-supplied installer packages (on my system at work, I have 18 different copies of PlistBuddy scattered throughout various packages / receipts).
Here’s how you’d twiddle the ComputerToolbarVisible attribute with PlistBuddy. Note that this is all one single command.
/Library/Receipts/AdditionalEssentials.pkg/Contents/Resources/PlistBuddy -c \\ "set ComputerOptions:ComputerToolbarVisible 1" \\ ~/Library/Preferences/com.apple.finder.plist
and then check the results…
{14} andre@werk [~] % defaults read com.apple.finder ComputerOptions | grep Toolbar ComputerToolbarVisible = 1;
Execute PlistBuddy with no arguments, and then again with -h for more information.