Возникли проблемы при разборе файла.plist для получения настроек по умолчанию

Я пишу сценарий, который должен определить, какой браузер текущий пользователь установил в качестве браузера по умолчанию. И кажется, что это можно найти в ~/Library/Preferences/com.apple.LaunchServices/com.apple.launchservices.secure.plist, Когда я open указанный файл (который запускает xcode), Я вижу, что есть как минимум 4 места, где браузер может быть указан по умолчанию ( Снимок экрана).

Таким образом, в основном, перебрать LSHandlers массив и...

  1. если LSHandlerContentType является public.url
    • вернуть LSHandlerRoleViewer
  2. если LSHandlerURLScheme является http
    • вернуть LSHandlerRoleAll
  3. если LSHandlerURLScheme является https
    • вернуть LSHandlerRoleAll
  4. если 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

0 ответов

Другие вопросы по тегам