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?


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

19

mdls -name kMDItemCFBundleIdentifier -r SomeApp.app


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.


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

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'
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.