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.