Lấy mã định danh gói của ứng dụng OS X trong tập lệnh shell


54

Một tùy chọn sẽ là sử dụng AppleScript:

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

Bạn cũng có thể làm một cái gì đó như thế này:

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

Cả hai đều khá chậm (khoảng 0,05-0,2 giây trên Air của tôi). Có bất kỳ tùy chọn nhanh hơn hoặc ít hacky?


1
Sử dụng defaults readcó vẻ như là cách đúng đắn để làm điều đó (hoặc truy vấn LaunchService thông qua Obj-C) - tại sao bạn lại coi 0,1s chậm?
Asmus

Tôi thích osascriptgiải pháp. Bao nhiêu lần một giây bạn cần để chạy này mặc dù?
arya

Câu trả lời:


38

Cách đọc định danh gói từ tệp Info.plist của ứng dụng trực tiếp bằng PlistBuddy (8):

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

19

mdls -name kMDItemCFBundleIdentifier -r SomeApp.app


8

Sử dụng lsappinfo

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

Để chỉ nhận giá trị bó, hãy thêm | cut -d '"' -f4vào lệnh đó

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

Bạn không phải xử lý mã của mình với đường dẫn của ứng dụng đó, ngay cả đường dẫn cũng thay đổi.

Miễn là ứng dụng được bắt đầu, bạn đã có một giá trị.

Mặc dù nó không nhanh như câu trả lời của @ surry, nhưng nó đủ nhanh.


Tôi không phải là người hạ cấp, nhưng điều này không hoạt động đáng tin cậy đối với tôi (trong khi các phương pháp khác làm). Nó hoạt động với một số ứng dụng nhưng không phải tất cả.
dùng137369

@ user137369 Bạn có thể vui lòng cho tôi biết ứng dụng đó là gì không? BTW, ứng dụng phải được khởi chạy để sử dụnglsappinfo
user1641838

4
lsappinfochỉ hoạt động trên các ứng dụng hiện đang chạy.
Ừm.

1

Giá trị của kMDItemKindphụ thuộc vào nội địa hóa hiện tại.

Còn cái này thì sao?

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

0

Nếu hiển thị tất cả các phần mở rộng tên tệp được bật, kMDItemDisplayName chứa .app cho một số ứng dụng nhưng không phải cho các ứng dụng khác. Điều này cũng sẽ thoát khỏi tên có chứa ', "hoặc \:

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

Một lựa chọn khác:

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

Một lệnh osascript duy nhất cũng có thể nhanh hơn:

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'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.