Bir OS X uygulamasının paket tanımlayıcısını bir kabuk kodunda alma


54

Bir seçenek AppleScript kullanmak olacaktır:

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

Bunun gibi bir şey de yapabilirsiniz:

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

Bunların her ikisi de oldukça yavaş (Havamda yaklaşık 0.05-0.2). Daha hızlı ya da daha az sahte seçenekler var mı?


1
Kullanmak defaults read, bunu yapmanın doğru yoluna benziyor (ya da LaunchServices'ı Obj-C aracılığıyla sorgulamak) - neden yavaş yavaş 0.1s düşünün?
Asmus,

Ben osascriptçözümü severim . Yine de bunu kaç saniyede çalıştırmak zorundasın?
arya

Yanıtlar:


38

Paket tanımlayıcısını, uygulamanın Info.plist dosyasından doğrudan PlistBuddy (8) kullanarak okumaya ne dersiniz:

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

19

mdls -name kMDItemCFBundleIdentifier -r SomeApp.app


8

kullanım lsappinfo

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

Yalnızca bundleid değerini almak | cut -d '"' -f4için bu komuta ekleyin

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

Kodunuzu o uygulamanın yoluyla işlemeniz gerekmez; yol değişse bile.

Uygulama başlatıldığı sürece, bir değeriniz vardır.

@ Surry'nin cevabı kadar hızlı olmasa da, yeterince hızlı.


Ben aşağı düşürücü değilim, ama bu benim için güvenilir bir şekilde çalışmıyor (diğerleri yöntemler olsa da). Bazı uygulamalarla çalışıyor ancak hepsi değil.
user137369

@ user137369 Lütfen bu uygulamanın ne olduğunu söyler misiniz? BTW, uygulama kullanmak için başlatılması gerekiyorlsappinfo
user1641838

4
lsappinfoyalnızca şu anda çalışan uygulamalarda çalışır.
mh.

1

kMDItemKindGeçerli yerelleştirmeye bağlı değerler .

Buna ne dersin?

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

0

Tüm dosya adı uzantılarının gösterilmesi etkinse, kMDItemDisplayName, bazı uygulamalar için .app içerir, diğerleri için değil. Bu aynı zamanda içeren isimleri kaçacağını ', "ya \:

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

Başka seçenek:

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

Tek bir osascript komutu da daha hızlı olabilir:

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'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.