Abrufen der Bundle-ID einer OS X-Anwendung in einem Shell-Skript

54

Eine Möglichkeit wäre die Verwendung von AppleScript:

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

Sie könnten auch so etwas tun:

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

Beide sind jedoch ziemlich langsam (ungefähr 0,05 bis 0,2 Sekunden in meiner Luft). Gibt es schnellere oder weniger hackige Optionen?

Lri
quelle
1
Die Verwendung defaults readscheint der richtige Weg zu sein (oder LaunchServices über Obj-C abzufragen) - warum halten Sie 0.1s für langsam?
Asmus
Ich mag die osascriptLösung. Wie oft pro Sekunde müssen Sie dies jedoch ausführen?
Arya

Antworten:

38

Wie wäre es, wenn Sie die Paket-ID direkt mit PlistBuddy (8) aus der Info.plist-Datei der Anwendung lesen würden:

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

mdls -name kMDItemCFBundleIdentifier -r SomeApp.app

Sean
quelle
8

Verwenden lsappinfo

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

Um nur den Wert bundleid zu erhalten, fügen Sie | cut -d '"' -f4diesen Befehl hinzu

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

Sie müssen Ihren Code nicht mit dem Pfad dieser Anwendung behandeln, auch wenn sich der Pfad ändert.

Solange die Anwendung gestartet ist, haben Sie einen Wert.

Es ist zwar nicht so schnell wie @surrys Antwort, aber es ist schnell genug.

user1641838
quelle
Ich bin nicht der Abwähler, aber dies funktioniert bei mir nicht zuverlässig (während die anderen Methoden dies tun). Es funktioniert mit einigen Apps, aber nicht allen.
user137369
@ user137369 Kannst du mir bitte sagen, was diese App ist? Übrigens muss die App gestartet werdenlsappinfo
user1641838 25.01.17
4
lsappinfoFunktioniert nur mit derzeit ausgeführten Apps.
mh.
1

Werte von kMDItemKindhängen von der aktuellen Lokalisierung ab.

Wie wäre es damit?

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

Wenn die Anzeige aller Dateinamenerweiterungen aktiviert ist, enthält kMDItemDisplayName für einige Anwendungen .app, für andere nicht. Dies würde auch die Namen entkommen , die enthalten ', "oder \:

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

Andere Option:

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

Ein einzelner osascript-Befehl kann auch schneller sein:

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'
Lri
quelle