Obtener el identificador de paquete de una aplicación OS X en un script de shell

54

Una opción sería usar AppleScript:

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

También podrías hacer algo como esto:

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

Sin embargo, ambos son bastante lentos (aproximadamente 0.05-0.2s en mi Air). ¿Hay alguna opción más rápida o menos hacky?

Lri
fuente
1
Usar defaults readparece ser la forma correcta de hacerlo (o consultar LaunchServices a través de Obj-C): ¿por qué considera 0.1s lento?
Asmus
Me gusta la osascriptsolucion. Sin embargo, ¿cuántas veces por segundo necesitas ejecutar esto?
arya

Respuestas:

38

¿Qué tal leer el identificador de paquete del archivo Info.plist de la aplicación directamente usando PlistBuddy (8):

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

mdls -name kMDItemCFBundleIdentifier -r SomeApp.app

Sean
fuente
8

Utilizar lsappinfo

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

Para obtener solo el valor del paquete, agregue | cut -d '"' -f4a ese comando

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

No tiene que manejar su código con la ruta de esa aplicación, incluso la ruta cambia.

Mientras se inicie la aplicación, obtendrá un valor.

Aunque no es tan rápido como la respuesta de @ surry, es lo suficientemente rápido.

usuario1641838
fuente
No soy el votante, pero esto no funciona de manera confiable para mí (mientras que los otros métodos sí lo hacen). Funciona con algunas aplicaciones pero no con todas.
usuario137369
@ user137369 ¿Podría decirme cuál es esa aplicación? Por cierto, la aplicación tiene que ser puesto en marcha para usarlsappinfo
user1641838
44
lsappinfosolo funciona en aplicaciones que se ejecutan actualmente.
mh.
1

Los valores de kMDItemKinddependen de la localización actual.

¿Qué tal esto?

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

Si se muestra mostrar todas las extensiones de nombre de archivo, kMDItemDisplayName contiene .app para algunas aplicaciones pero no para otras. Esto también podría escapar nombres que contienen ', "o \:

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)"

Otra opción:

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')"

Un solo comando osascript también podría ser más rápido:

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
fuente