शेल स्क्रिप्ट में OS X एप्लिकेशन का बंडल पहचानकर्ता प्राप्त करना


54

एक विकल्प AppleScript का उपयोग करना होगा:

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

आप भी कुछ ऐसा कर सकते हैं:

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

हालांकि ये दोनों काफी धीमी हैं (मेरी वायु पर लगभग 0.05-0.2s)। क्या कोई तेज़ या कम हैक करने वाले विकल्प हैं?


1
का उपयोग करना defaults readसही तरीके से ऐसा लगता है (या लॉन्चिंग सर्विसेज को ओब्ज-सी के माध्यम से क्वेरी करना) - आप 0.1s को धीमा क्यों मानते हैं?
असमस

मुझे osascriptसमाधान पसंद है । हालाँकि इसे चलाने के लिए आपको कितनी बार सेकंड की आवश्यकता होगी?
आर्य

जवाबों:


38

आवेदन के Info.plist फ़ाइल से बंडल पहचानकर्ता को पढ़ने के बारे में कैसे सीधे PlistBuddy (8) का उपयोग कर:

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


8

उपयोग lsappinfo

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

केवल बंडल वेल्यू प्राप्त करने के लिए, | cut -d '"' -f4उस कमांड में जोड़ें

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

आपको अपने कोड को उस एप्लिकेशन के पथ के साथ संभालना नहीं है, यहां तक ​​कि पथ परिवर्तन भी नहीं है।

जब तक आवेदन शुरू होता है, तब तक आपको एक मूल्य मिलता है।

हालाँकि यह @ सर्री के उत्तर के रूप में तेज़ नहीं है, लेकिन यह काफी तेज़ है।


मैं नीच नहीं हूं, लेकिन यह मेरे लिए मज़बूती से काम नहीं करता (जबकि अन्य तरीके करते हैं)। यह कुछ ऐप्स के साथ काम कर रहा है लेकिन सभी नहीं।
user137369

@ user137369 क्या आप मुझे बता सकते हैं कि वह ऐप क्या है? BTW, ऐप को उपयोग करने के लिए लॉन्च किया जाना हैlsappinfo
user1641838

4
lsappinfoवर्तमान में चल रहे ऐप्स पर ही काम करता है।
एमएच।

1

kMDItemKindवर्तमान स्थानीयकरण पर निर्भर होने का मूल्य ।

इस बारे में कैसा है?

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

0

यदि सभी फ़ाइल नाम एक्सटेंशन दिखाने में सक्षम है, तो kMDItemDisplayName में कुछ अनुप्रयोगों के लिए .app है, लेकिन अन्य नहीं। यह उन नामों से भी बच जाएगा ', जिनमें शामिल हैं ", या \:

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

एक अन्य विकल्प:

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

एक एकल ऑसस्क्रिप्ट कमांड भी तेज हो सकती है:

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'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.