Возникли проблемы при разборе файла.plist для получения настроек по умолчанию
Я пишу сценарий, который должен определить, какой браузер текущий пользователь установил в качестве браузера по умолчанию. И кажется, что это можно найти в ~/Library/Preferences/com.apple.LaunchServices/com.apple.launchservices.secure.plist
, Когда я open
указанный файл (который запускает xcode
), Я вижу, что есть как минимум 4 места, где браузер может быть указан по умолчанию ( Снимок экрана).
Таким образом, в основном, перебрать LSHandlers
массив и...
- если
LSHandlerContentType
являетсяpublic.url
- вернуть
LSHandlerRoleViewer
- вернуть
- если
LSHandlerURLScheme
являетсяhttp
- вернуть
LSHandlerRoleAll
- вернуть
- если
LSHandlerURLScheme
являетсяhttps
- вернуть
LSHandlerRoleAll
- вернуть
- если
LSHandlerContentType
являетсяpublic.html
- вернуть
LSHandlerRoleViewer
- вернуть
Проблема, с которой я сталкиваюсь, заключается в том, что эти значения хранятся в словарях в массиве. И я могу знать индексы, в которых эти значения хранятся в массиве на моей машине, но это не гарантирует, что они будут одинаковыми в отдельной OS X.
Сначала я попытался использовать defaults
команда, но это действительно, казалось, только дало мне один уровень в данных:
$ pfile=~/Library/Preferences/com.apple.LaunchServices/com.apple.launchservices.secure.plist
$ defaults read ${pfile} | head -n 5
{
LSHandlers = (
{
LSHandlerContentType = "public.url";
LSHandlerPreferredVersions = {
$ defaults read ${pfile} LSHandlers | head -n 5
(
{
LSHandlerContentType = "public.url";
LSHandlerPreferredVersions = {
LSHandlerRoleViewer = "-";
Мне трудно понять, как читать что-нибудь за LSHandlers
используя значения по умолчанию. Так что я посмотрел немного больше и нашел PlistBuddy
что кажется в 10 раз более полезным.
$ /usr/libexec/PlistBuddy -c "print :LSHandlers:0:LSHandlerRoleViewer" ${pfile}
com.google.chrome
$ /usr/libexec/PlistBuddy -c "print :LSHandlers:1:LSHandlerRoleAll" ${pfile}
org.mozilla.firefox
$ /usr/libexec/PlistBuddy -c "print :LSHandlers:2:LSHandlerRoleAll" ${pfile}
org.mozilla.firefox
$ /usr/libexec/PlistBuddy -c "print :LSHandlers:3:LSHandlerRoleAll" ${pfile}
org.mozilla.firefox
Но, как вы можете видеть из приведенного выше, мне нужно знать положение элемента в LSHandlers
массив, и я должен знать, если это LSHandlerRoleViewer
или LSHandlerRoleAll
ценность, которую я собираюсь.
Есть ли способ добавить некоторую логику в команду PlistBuddy для перебора значений и печати определенных элементов, если выполняются условия? Примерно так (предположим, что LSHandlers - это словарь, разобранный в Python):
for lshandler in :LSHandlers
if 'LSHandlerContentType' in lshandler
for lsh in LSHandlers:
if 'LSHandlerContentType' in lsh:
if lsh['LSHandlerContentType'] is 'public.url':
print("%s: %s\n" % {lsh['LSHandlerContentType'], lsh['LSHandlerRoleViewer']})
elif lsh['LSHandlerContentType'] is 'public.html':
print("%s: %s\n" % {lsh['LSHandlerContentType'], lsh['LSHandlerRoleAll']})
elif 'LSHandlerURLScheme' in lsh:
if lsh['LSHandlerURLScheme'] in ['http','https']:
print("%s: %s\n" % {lsh['LSHandlerURLScheme'], lsh['LSHandlerRoleAll']})
# Output:
# public.url: com.google.chrome
# public.html: org.mozilla.firefox
# http: org.mozilla.firefox
# https: org.mozilla.firefox
Любая помощь приветствуется. Спасибо!
-J