I have written a few posts in the past about parsing data from property list files in scripts and Terminal. My usual tool for this is PlistBuddy
. However, PlistBuddy
’s syntax is… well… eccentric.
Recently, Alexis Bridoux, who is also the main developer on Octory, introduced a command line tool called scout
which solves many of the issues I have with PlistBuddy
.
For example, you can pipe the output of another command into scout
, something you can only convince PlistBuddy
to do with some major shell syntax hackery.
So instead of this:
> /usr/libexec/PlistBuddy -c "print :dsAttrTypeStandard\:RealName:0" /dev/stdin <<< $(dscl -plist . read /Users/armin RealName)
With scout
I can use this much clearer syntax:
> dscl -plist . read /Users/armin RealName | scout "dsAttrTypeStandard:RealName[0]"
The tool can also modify existing files, by changing, adding or deleting keys.
scout
can also parse JSON and (non plist) XML files, so it can also stand in as a replacement for jq
and xpath
. It will also color-code output for property list, XML and JSON files.
I have been using scout
interactively in the Terminal for a while now. So far, I have been refraining from using scout
in scripts I use for deployment. To use a non-system tool in deployment scripts, you need to ensure the tool is deployed early in the setup process. Then you also have to write your scripts in a way that they will gracefully fail or fallback to PlistBuddy
in the edge case where scout
is not installed:
scout="/usr/local/bin/scout"
if [ ! -x "$scout"]; then
echo "could not find scout, exiting..."
exit 1
fi
realName=$( dscl -plist . read /Users/armin RealName | scout "dsAttrTypeStandard:RealName[0]" )
All of this overhead, adds extra burden to using a tool. The good news is that scout
comes as a signed and notarized package installer, which minimizes deployment effort.
I wills be considering scout for future projects. If anyone at Apple is reading this: please hire Alexis and integrate scout
or something like it in macOS.