Est-il possible d'interroger la base de données des services de lancement pour les applications qui ouvriront un fichier arbitraire ou un type UTI?

11

Je peux utiliser mdls pour afficher l' identificateur de type uniforme (UTI) pour un fichier arbitraire ainsi que la hiérarchie des types qui sont des sur-ensembles d'un UTI spécifique.

mac:~ mike$ mdls -name kMDItemContentType -name kMDItemContentTypeTree foo.ksh
kMDItemContentType     = "public.ksh-script"
kMDItemContentTypeTree = (
    "public.ksh-script",
    "public.shell-script",
    "public.script",
    "public.source-code",
    "public.plain-text",
    "public.text",
    "public.data",
    "public.item",
    "public.content"
)
mac:~ mike$ mdls -name kMDItemContentType -name kMDItemContentTypeTree foo.command
kMDItemContentType     = "com.apple.terminal.shell-script"
kMDItemContentTypeTree = (
    "com.apple.terminal.shell-script",
    "public.shell-script",
    "public.script",
    "public.source-code",
    "public.plain-text",
    "public.text",
    "public.data",
    "public.item",
    "public.content"
)

Y a-t-il des outils qui peuvent montrer quelles applications se sont inscrites pour une UTI particulière autre que l'essai et l'erreur?

Il ressort de l'inspection que le foo.commandfichier sera ouvert par Terminal.app, mais il n'est pas du tout clair que foo.ksh appartient actuellement à TextEdit.app.

J'aimerais pouvoir lire directement la base de données des services de lancement de Mac OS X sans avoir recours à l'utilisation openpour voir quelle application est choisie par UTI. Ce serait comme si des --preview --verbosecommutateurs s'ouvraient pour me dire ce que cela ferait plutôt que de le faire.

Encore mieux serait un moyen de répertorier toutes les applications qui pourraient ouvrir cette UTI, même si elles ne sont pas l'application préférée.

Pour obtenir ces informations secondaires, je dois créer ou trouver un fichier pour chaque type d'intérêt et utiliser le Finder pour afficher manuellement les applications pouvant ouvrir cette interface utilisateur.

entrez la description de l'image ici

J'aimerais vraiment pouvoir accéder à ces données par programmation depuis le terminal.

bmike
la source
L'achèvement de zsh semble intéressant, mais je ne vois pas comment l'obtenir en tant que stdout. Je vais regarder le code source d'AppApplications et voir si le binaire fonctionne sur Lion ou je peux le faire compiler. C'est une excellente paire de pistes - merci!
bmike

Réponses:

6

Le duti d' Andrew Mortensen est une CLI qui listera les gestionnaires UTI:

  • -d <uti> répertorie le gestionnaire par défaut;
  • -l <uti> répertorie tous les gestionnaires enregistrés.

Voir la page de manuel pour duti .

EDIT: comme le souligne Lri dans cette réponse , duti ne semble pas lister toutes les applications possibles (peut-être parce qu'il ne tient pas compte de l'héritage UTI? Ce serait une question à approfondir). Sa solution recommandée, AllApllications serait évidemment une meilleure réponse.

kopischke
la source
Il manque cependant certaines applications qui seraient affichées à l'air libre avec le menu.
Lri
Très étrange. Pourriez-vous me dire lesquels il manque?
kopischke
J'ai modifié ma réponse dans l'autre question pour inclure un exemple de sortie de duti.
Lri
Bien que duti soit bien écrit, il utilise désormais des API obsolètes. Je recommande de jeter un œil à developer.apple.com/library/prerelease/mac/documentation/Carbon/…
Mugen
OK - l'installation de ceci par homebrew frappe un coup de circuit. Merci beaucoup!
bmike
11

Vous pouvez utiliser cette commande pour examiner la base de données des services de lancement. L'option -dump vous donne l'intégralité de la base de données, vous pouvez ensuite la diriger vers grep et rechercher ce que vous voulez.

/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister -dump | grep -n7 'your search string'

Chris
la source
Je devrai probablement poser une question suivante sur la façon de traiter ce vidage pour cracher le bundle d'application ou l'emplacement du fichier mdimporter spécifique qui analyse un kMDItemContentType spécifique - mais cela a grandement aidé. Merci
bmike