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?

Lri
la source
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
surryhill
la source
19

mdls -name kMDItemCFBundleIdentifier -r SomeApp.app

Sean
la source
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.

utilisateur1641838
la source
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)"
Elmimmo
la source
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'
Lri
la source