如果启用了显示所有文件扩展名的显示,则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'
defaults read
似乎是正确的方法(或者通过Obj-C查询LaunchServices)-为什么您认为0.1s慢?