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?
defaults read
parece ser o caminho certo para fazer isso (ou consultar o LaunchServices via Obj-C) - por que você considera 0,1s lento?osascript
solução. Quantas vezes por segundo você precisa executar isso?Respostas:
Que tal ler o identificador de pacote configurável diretamente do arquivo Info.plist do aplicativo usando o PlistBuddy (8):
fonte
mdls -name kMDItemCFBundleIdentifier -r SomeApp.app
fonte
Usar
lsappinfo
Para obter apenas o valor do pacote configurável, adicione
| cut -d '"' -f4
a esse comandoVocê 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.
fonte
lsappinfo
lsappinfo
só funciona em aplicativos em execução no momento.Valores de
kMDItemKind
dependem da localização atual.Que tal agora?
fonte
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:
fonte