Как проверить, установлено ли конкретное приложение / программное обеспечение в Mac OS - PullRequest
8 голосов
/ 13 июля 2011

Я хочу проверить, установлено ли конкретное приложение в Mac OS с помощью сценариев Perl / Shell. Я пишу пакет, используя PackageMaker, в котором мне нужно проверить пользовательский компьютер на наличие нескольких приложений перед установкой приложения. Поэтому я планирую написать сценарий, который проверит это для меня. Пожалуйста, посоветуйте, если я смогу выполнить это лучше.

Ответы [ 4 ]

11 голосов
/ 15 октября 2012

В дополнение к @ 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; }
}
7 голосов
/ 06 ноября 2011

Следующий скрипт bash использует AppleScript, чтобы проверить, установлено ли приложение, на основе решения , разработанного Майклом Пилатом :

#!/bin/bash

APPLESCRIPT=`cat <<EOF
on run argv
  try
    tell application "Finder"
      set appname to name of application file id "$1"
      return 1
    end tell
  on error err_msg number err_num
    return 0
  end try
end run
EOF`

retcode=`osascript -e "$APPLESCRIPT"`
exit $retcode

Скрипт ожидает идентификатор приложения (например, com.apple.preview).После выполнения сценария retcode содержит 1, если приложение установлено, и 0, если приложение не установлено.Сценарий также возвращает retcode.

Например:

$ ./appinst.sh com.apple.preview
$ echo $?
1
$

или

$ ./appinst.sh nonono
$ echo $?
0
$
4 голосов
/ 06 ноября 2011

Для этого вы можете использовать команду system_profiler. Попробуйте что-то вроде этого:

system_profiler SPApplicationsDataType | grep AppName
0 голосов
/ 04 июля 2012

В большинстве случаев все сторонние приложения устанавливаются в папке «Приложения». Простейшим способом было бы просто пройти через это.

ls /Applications/ | grep -i APP_NAME

Просто замените APP_NAME тем, что вы ищете. "-I" делает регистр нечувствительным к регистру, поэтому, если он установлен, за исключением некоторых серьезных орфографических ошибок, он выведет список файлов. Иначе ничего не вернется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...