Mendapatkan pengidentifikasi bundel aplikasi OS X dalam skrip shell

54

Salah satu opsi adalah menggunakan AppleScript:

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

Anda juga dapat melakukan sesuatu seperti ini:

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

Keduanya cukup lambat (sekitar 0,05-0,2 detik di Udara saya). Apakah ada opsi hacky yang lebih cepat atau kurang?

Lri
sumber
1
Menggunakan defaults readsepertinya cara yang tepat untuk melakukannya (atau meminta layanan LaunchServices via Obj-C) - mengapa Anda menganggap 0,1s lambat?
Asmus
Saya suka osascriptsolusinya. Berapa kali sedetik Anda perlu menjalankan ini?
arya

Jawaban:

38

Bagaimana dengan membaca pengidentifikasi bundel dari file Info.plist aplikasi secara langsung menggunakan PlistBuddy (8):

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

mdls -name kMDItemCFBundleIdentifier -r SomeApp.app

Sean
sumber
8

Menggunakan lsappinfo

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

Untuk mendapatkan hanya nilai bundleid, tambahkan | cut -d '"' -f4ke perintah itu

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

Anda tidak harus menangani kode Anda dengan jalur aplikasi itu, bahkan jalurnya pun berubah.

Selama aplikasi dimulai, Anda mendapat nilai.

Meskipun tidak secepat jawaban @ surry, tapi itu cukup cepat.

pengguna1641838
sumber
Saya bukan downvoter, tetapi ini tidak bekerja andal bagi saya (sementara metode lain melakukannya). Ini berfungsi dengan beberapa aplikasi tetapi tidak semua.
user137369
@ user137369 Bisakah Anda memberi tahu saya aplikasi apa itu? BTW, aplikasi harus diluncurkan untuk menggunakanlsappinfo
user1641838
4
lsappinfohanya berfungsi pada aplikasi yang sedang berjalan.
mh.
1

Nilai kMDItemKindketergantungan pada lokalisasi saat ini.

Bagaimana dengan ini?

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

Jika menunjukkan semua ekstensi nama file diaktifkan, kMDItemDisplayName berisi .app untuk beberapa aplikasi tetapi tidak yang lain. Ini juga akan melarikan diri nama yang mengandung ', "atau \:

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

Pilihan lain:

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

Satu perintah osascript mungkin juga lebih cepat:

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
sumber