Ottenere l'identificatore del bundle di un'applicazione OS X in uno script di shell


54

Un'opzione sarebbe usare AppleScript:

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

Potresti anche fare qualcosa del genere:

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

Entrambi sono piuttosto lenti (circa 0,05-0,2 secondi sulla mia Air). Ci sono opzioni più veloci o meno confuse?


1
L'utilizzo defaults readsembra il modo giusto per farlo (oppure per eseguire query su LaunchServices tramite Obj-C): perché consideri 0.1s lento?
Asmus,

Mi piace la osascriptsoluzione. Quante volte al secondo devi eseguire questo però?
Arya,

Risposte:


38

Che ne dite di leggere l'identificatore del bundle dal file Info.plist dell'applicazione direttamente usando PlistBuddy (8):

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

19

mdls -name kMDItemCFBundleIdentifier -r SomeApp.app


8

Uso lsappinfo

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

Per ottenere solo il valore bundleid, aggiungi | cut -d '"' -f4a quel comando

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

Non è necessario gestire il codice con il percorso di tale applicazione, anche il percorso cambia.

Finché l'applicazione viene avviata, si ottiene un valore.

Anche se non è veloce come la risposta di @ surry, ma è abbastanza veloce.


Non sono il downvoter, ma questo non funziona in modo affidabile per me (mentre gli altri metodi funzionano). Funziona con alcune app ma non tutte.
user137369

@ user137369 Potresti dirmi cos'è quell'app? A proposito, l'app deve essere avviata per l'usolsappinfo
user1641838

4
lsappinfoFunziona solo su app attualmente in esecuzione.
mh.

1

I valori di kMDItemKinddipendono dalla localizzazione corrente.

Cosa ne pensi di questo?

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

0

Se la visualizzazione di tutte le estensioni di file è abilitata, kMDItemDisplayName contiene .app per alcune applicazioni ma non altre. Ciò consentirebbe anche di sfuggire i nomi che contengono ', "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)"

Un'altra opzione:

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 singolo comando osascript potrebbe anche essere più veloce:

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'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.