Al parecer, MacOS Ventura ya no nos permite configurar los elementos de la aplicación del Dock por defecto desde Root (el comando falla silenciosamente), por lo que estamos teniendo que ejecutar en el espacio del usuario desde nuestro MDM script. Por desgracia, esto significa que tengo que encadenar un comando grep con SU que me está causando todo tipo de problemas para los elementos que tienen espacios:
zsh para el entorno, otra lógica para establecer $current_user que no es relevante eliminada.
printf '%s%s%s%s%s' \
'<dict><key>tile-data</key><dict><key>file-data</key><dict>' \
'<key>_CFURLString</key><string>' \
"$1" \
'</string><key>_CFURLStringType</key><integer>0</integer>' \
'</dict></dict></dict>'
}
for dockItem in {/Applications/{"Google Chrome","Slack","zoom.us"}.app,"Done"}; do
echo $dockItem
if [[ -e "$dockItem" ]]; then
if ! [[ $dockItem == "Done" ]]; then
# Does not actually work, nor does setting GREP_ARRAY=(-q "$dockItem") with grep "${GREP_ARRAY[@]}"
# does not properly escape the path when executed "Chrome.app does not exist"
EscapedPath=$( echo "$dockItem" | sed 's/ /\\ /g' )
if (/usr/bin/su - "${current_user}" -c "defaults read com.apple.dock persistent-apps | /usr/bin/grep -q $EscapedPath"); then
printf '%s\n' 'Dock icon already found.'
else
printf '%s\n' 'Setting up Dock icons...'
/usr/bin/su - "${current_user}" -c "defaults write com.apple.dock persistent-apps -array-add '$(__dock_item $dockItem)'"
fi
fi
else
printf '%s\n' 'Restarting Dock...'
killall Dock
fi
done
Cada vez que intenta procesar "Google Chrome", el comando grep falla y la aplicación se ancla al dock de nuevo, creando un ciclo interminable de copias de Chrome que se añaden.
He probado varios métodos para escapar $dockItem, y convertirlo en un array, pero no reconoce la cadena completa en el shell zsh de Ventura.
if (/usr/bin/su - "${current_user}" -c "defaults read com.apple.dock persistent-apps | /usr/bin/grep -q '$dockItem'"); then
Tampoco se escapa correctamente cuando se ejecuta.