シェルスクリプトでOS Xアプリケーションのバンドル識別子を取得する


54

1つのオプションは、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

ただし、これらはどちらもかなり遅い(私のAirでは約0.05〜0.2秒)。より高速な、またはよりハッキングの少ないオプションはありますか?


1
使用するのdefaults readは正しい方法のようです(または、Obj-Cを介してLaunchServicesを照会します)-なぜ0.1秒遅いと考えるのですか?
アスマス

私はosascript解決策が好きです。ただし、これを実行するのに1秒に何回必要ですか?
アリア

回答:


38

PlistBuddy(8)を使用して、アプリケーションのInfo.plistファイルからバンドル識別子を直接読み取る方法は次のとおりです。

/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そのアプリは何ですか?ところで、アプリを使用するには起動する必要があります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.