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?


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

19

mdls -name kMDItemCFBundleIdentifier -r SomeApp.app


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.


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

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'
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.