การรับตัวบ่งชี้บันเดิลของแอ็พพลิเคชัน 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ดูเหมือนจะเป็นวิธีที่เหมาะสมในการทำ (หรือการสอบถาม LaunchServices ผ่าน Obj-C) - เหตุใดคุณจึงพิจารณา 0.1s ช้า
Asmus

ฉันชอบosascriptวิธีแก้ปัญหา คุณต้องรันครั้งนี้กี่ครั้งต่อวินาที?
arya

คำตอบ:


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"

ในการรับค่า bundleid เท่านั้นให้เพิ่ม| cut -d '"' -f4คำสั่งนั้น

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

คุณไม่จำเป็นต้องจัดการรหัสของคุณด้วยเส้นทางของแอปพลิเคชันนั้น ๆ แม้แต่เส้นทางที่เปลี่ยนไป

ตราบใดที่แอปพลิเคชันเริ่มต้นคุณก็จะได้รับค่า

แม้ว่าจะไม่เร็วเท่าคำตอบของ @ surry แต่ก็เร็วพอ


ฉันไม่ใช่ผู้ลงคะแนน แต่นี่ไม่ได้ผลสำหรับฉัน (ในขณะที่วิธีการอื่นทำ) มันใช้งานได้กับบางแอพ แต่ไม่ใช่ทั้งหมด
user137369

@ user137369 คุณช่วยบอกหน่อยได้ไหมว่าแอพนั้นคืออะไร? BTW แอปจะต้องเปิดตัวเพื่อใช้งานlsappinfo
user1641838

4
lsappinfoใช้งานได้เฉพาะบนแอปที่รันอยู่ในปัจจุบันเท่านั้น
mh

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 เดียวอาจจะเร็วกว่า:

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'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.