В дополнение к @ Bavarious 'полезному ответу :
Вот универсальные bash
функции , которые расширяют проверку только того, установлено ли приложение, возвращая либопуть к приложению или идентификатор пакета, если он установлен.Если вы разместите их в своем профиле bash, они также могут пригодиться для интерактивного использования.
Любая из этих функций также может использоваться для проверки того, установлено ли приложение;Например:
if ! whichapp 'someApp' &>/dev/null; then ... # not installed
Ни одна из функций не учитывает регистр, и при указании name суффикс .app
является необязательным.Однако обратите внимание, что локализованные имена не распознаны.
whichapp
Функция для поиска приложений по либо идентификатор пакета или имя.Возвращает путь к приложению, если он найден;в противном случае выдает ошибку.
Примеры:
whichapp finder # -> '/System/Library/CoreServices/Finder.app/'
whichapp com.apple.finder # -> '/System/Library/CoreServices/Finder.app/'
bundleid
Учитывая имя приложения, возвращает идентификатор его пакета.
Пример:
bundleid finder # -> 'com.apple.finder'
Замечание по реализации: В коде AppleScript заманчиво обойти контекст Finder и просто использовать, например, application [id] <appNameOrBundleId>
и path to application [id] <appNameOrBundleId>
в глобальном контексте, но проблема в том, что это неизменно запускает целевое приложение,что нежелательно.
источник: whichapp
whichapp() {
local appNameOrBundleId=$1 isAppName=0 bundleId
# Determine whether an app *name* or *bundle ID* was specified.
[[ $appNameOrBundleId =~ \.[aA][pP][pP]$ || $appNameOrBundleId =~ ^[^.]+$ ]] && isAppName=1
if (( isAppName )); then # an application NAME was specified
# Translate to a bundle ID first.
bundleId=$(osascript -e "id of application \"$appNameOrBundleId\"" 2>/dev/null) ||
{ echo "$FUNCNAME: ERROR: Application with specified name not found: $appNameOrBundleId" 1>&2; return 1; }
else # a BUNDLE ID was specified
bundleId=$appNameOrBundleId
fi
# Let AppleScript determine the full bundle path.
fullPath=$(osascript -e "tell application \"Finder\" to POSIX path of (get application file id \"$bundleId\" as alias)" 2>/dev/null ||
{ echo "$FUNCNAME: ERROR: Application with specified bundle ID not found: $bundleId" 1>&2; return 1; })
printf '%s\n' "$fullPath"
# Warn about /Volumes/... paths, because applications launched from mounted
# devices aren't persistently installed.
if [[ $fullPath == /Volumes/* ]]; then
echo "NOTE: Application is not persistently installed, due to being located on a mounted volume." >&2
fi
}
Примечание : функция также находит приложения, запущенные с подключенного тома в данном сеансе Спасибо, Wonder Dog . , но поскольку такие приложения не установлены постоянно (не зарегистрированы в MacOS Launch Services), в этом случае выдается предупреждение .событие.
При желании вы можете легко изменить функцию для сообщения об ошибке.
source: bundleid
bundleid() {
osascript -e "id of application \"$1\"" 2>/dev/null ||
{ echo "$FUNCNAME: ERROR: Application with specified name not found: $1" 1>&2; return 1; }
}