Obtendo o Identificador de Pacote Configurável de um Aplicativo OS X em um Script de Shell

54

Uma opção seria usar AppleScript:

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

Você também pode fazer algo assim:

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

Ambos são bastante lentos (cerca de 0,05-0,2s no meu ar). Existem opções mais rápidas ou menos hacky?

Lri
fonte
1
Usar defaults readparece ser o caminho certo para fazer isso (ou consultar o LaunchServices via Obj-C) - por que você considera 0,1s lento?
Asmus
Eu gosto da osascriptsolução. Quantas vezes por segundo você precisa executar isso?
Arian #

Respostas:

38

Que tal ler o identificador de pacote configurável diretamente do arquivo Info.plist do aplicativo usando o PlistBuddy (8):

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

mdls -name kMDItemCFBundleIdentifier -r SomeApp.app

Sean
fonte
8

Usar lsappinfo

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

Para obter apenas o valor do pacote configurável, adicione | cut -d '"' -f4a esse comando

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

Você não precisa manipular seu código com o caminho desse aplicativo, mesmo o caminho muda.

Desde que o aplicativo seja iniciado, você terá um valor.

Embora não seja tão rápido quanto a resposta de @ surry, é rápido o suficiente.

user1641838
fonte
Eu não sou o derrotador, mas isso não funciona de maneira confiável para mim (enquanto os outros métodos funcionam). Está trabalhando com alguns aplicativos, mas não com todos.
precisa saber é o seguinte
@ user137369 Você poderia me dizer o que é esse aplicativo? BTW, o aplicativo deve ser iniciado para usolsappinfo
user1641838 25/17/17
4
lsappinfosó funciona em aplicativos em execução no momento.
mh.
1

Valores de kMDItemKinddependem da localização atual.

Que tal agora?

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

Se a exibição de todas as extensões de nome de arquivo estiver ativada, o kMDItemDisplayName conterá .app para alguns aplicativos, mas não para outros. Isso também iria escapar nomes que contenham ', "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)"

Outra opção:

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

Um único comando osascript também pode ser mais 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
fonte