Obtention de l'identifiant d'ensemble d'une application OS X dans un script shell


54

Une option serait d'utiliser AppleScript:

$ osascript -e 'id of app "Finder"'
com.apple.finder

Vous pouvez aussi faire quelque chose comme ça:

$ bundle=$(mdfind -onlyin / kMDItemKind==Application | grep -i "/Finder.app$" | head -1)
$ defaults read "$bundle/Contents/Info" CFBundleIdentifier
com.apple.finder

Les deux sont assez lents (environ 0,05-0,2s sur mon Air) cependant. Y at-il des options plus rapides ou moins hacky?


1
Utiliser cela defaults readsemble être la bonne façon de le faire (ou interroger LaunchServices via Obj-C) - pourquoi considérez-vous que 0,1s est lent?
Asmus

J'aime la osascriptsolution. Combien de fois par seconde avez-vous besoin de l'exécuter?
arya

Réponses:


38

Pourquoi ne pas lire l'identifiant de paquet à partir du fichier Info.plist de l'application directement à l'aide de PlistBuddy (8):

/usr/libexec/PlistBuddy -c 'Print CFBundleIdentifier' /Applications/Safari.app/Contents/Info.plist

19

mdls -name kMDItemCFBundleIdentifier -r SomeApp.app


8

Utilisation lsappinfo

CC@~ $ lsappinfo info -only bundleid Finder
"CFBundleIdentifier"="com.apple.finder"

Pour obtenir uniquement la valeur de bundleid, ajoutez | cut -d '"' -f4à cette commande

CC@~ $ lsappinfo info -only bundleid Finder | cut -d '"' -f4
com.apple.finder

Vous n'avez pas à gérer votre code avec le chemin de cette application, même si le chemin est modifié.

Tant que l'application est lancée, vous avez une valeur.

Bien que ce ne soit pas aussi rapide que la réponse de @ surry, mais c'est assez rapide.


Je ne suis pas le votant inférieur, mais cela ne fonctionne pas de manière fiable pour moi (contrairement aux autres méthodes). Cela fonctionne avec certaines applications mais pas toutes.
user137369

@ user137369 Pourriez-vous s'il vous plaît me dire quelle est cette application? BTW, l'application doit être lancée à utiliserlsappinfo
user1641838

4
lsappinfone fonctionne que sur les applications en cours d'exécution.
mh.

1

Les valeurs de kMDItemKinddépendent de la localisation actuelle.

Que dis-tu de ça?

mdls -name kMDItemCFBundleIdentifier \
     -raw "$(mdfind "(kMDItemContentTypeTree=com.apple.application) && (kMDItemDisplayName == 'photoshop*'cdw)" | head -1)"

0

Si l'affichage de toutes les extensions de nom de fichier est activé, kMDItemDisplayName contient .app pour certaines applications mais pas pour d'autres. Cela échapperait aussi des noms qui contiennent ', "ou \:

a="Consultant's Canary"; a="${a//\'/\'}.app"; a=${a//"/\\"}; a=${a//\\/\\\\}; mdls -name kMDItemCFBundleIdentifier -raw "$(mdfind 'kMDItemContentType==com.apple.application-bundle&&kMDItemFSName=="'"$a"'"' | head -n1)"

Une autre option:

a=Finder; mdls -name kMDItemCFBundleIdentifier -raw "$(mdfind kMDItemContentType==com.apple.application-bundle | sed -E $'s|(.*/)(.*)|\\1\t\\2|' | grep -F $'\t'"$a".app -m1 | tr -d '\t')"

Une seule commande osascript pourrait aussi être plus rapide:

osascript -e 'on run args
set output to {}
repeat with a in args
set end of output to id of app a
end
set text item delimiters to linefeed
output as text
end' Finder 'AppleScript Editor'
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.