2

Я развертываю образ NetRestore на нескольких видах компьютеров Mac: MacBook, MacBook Pro, Mac Pro, iMac и Mac Minis. У меня есть несколько пользовательских экранов входа в систему, которые я хотел бы использовать, но все до 10.10 требует, чтобы вы знали разрешение монитора, иначе фон входа не будет отображаться правильно.

Есть ли способ использовать вывод этого кода в качестве переменной для серии операторов if/then ?

system_profiler SPDisplaysDataType |grep Resolution

Нормальный вывод показывает вот так

Resolution: 2560 x 1440
Resolution: 1920 x 1200
Resolution: 1920 x 1200

(Это если у вас три монитора ... Я бы предпочел использовать первый результат).

Я намерен запустить скрипт при привязке Mac к Active Directory, что должно быть сделано вручную, поэтому разрешение должно быть уже доступно. Он выберет изображение с правильным разрешением и затем скопирует его в нужное место.

Или случайно у кого-нибудь есть хорошая идея о том, как создавать собственные фоны окон входа в систему и фоны пользователей для работы на любом типе Mac с любым разрешением, как в ОС, когда вы выбираете «По размеру экрана» в Системных настройках?

1 ответ1

2

Есть так много способов сделать это, но если вы хотите придерживаться только / в основном bash, вот два подхода.

  • system_profiler имеет возможность вывода в XML. Используйте это, чтобы поместить выходные данные в переменную или файл, например, поэтому убедитесь, что в них включены двойные кавычки

    someVar="$(system_profiler SPDisplaysDataType -xml)"
    
  • Это возвращает массив под _items именем _IODisplayEDID который отображает отображаемое имя как _name и разрешение как _IODisplayEDID

  • Если вы обязались / хотите сохранить его в bash, вот хороший ответ на StackOverflow.com для Как разобрать XML в bash, который я не буду перефразировать. Но на этом этапе вам следует рассмотреть возможность использования ссылки XML-анализатора XMLStartlet или xsltproc которая включена в Xcode Dev Tools.

Все это говорит о том, что вы все равно можете пойти по маршруту grep но должны сделать некоторые предположения об общей длине вывода и размещении "Resolution" на интересующем дисплее. Вот грубый тест, основанный на моей системе 2 дисплея:

  • Сначала получите отображаемые имена. Чтобы учесть пробелы в имени, вы можете временно сбросить $ IFS для использования только новой строки, а затем использовать grep -A чтобы получить 50 строк (предположение) после "Displays", не возвращать первую строку и получать значения имени, так как они заканчиваются в : (это много предположений, чтобы сделать!)

    IFStemp=${IFS}
    IFS=$'\n'
    var=($(system_profiler SPDisplaysDataType|grep -A 50 \ Displays|grep -v Displays|egrep ':$'))
    
  • Затем используйте это, чтобы получить предположение, где будет находиться "Разрешение". Вы, очевидно, можете использовать sub printf для имени переменной, но я хотел показать вывод. Я использовал sed чтобы обрезать ведущие места.

    for displayName in ${var[@]}; do
       printf '%s = %s\n' "${displayName%?}" "$(system_profiler SPDisplaysDataType|grep -A 3 "${displayName}"|grep Resolution|sed -e 's/^[[:space:]]*//g' -e 's/Resolution\:\ //g')"
    done
    
  • Теперь сбросим вам $ IFS

    IFS=${IFStemp}
    unset IFStemp
    

И вот как выглядел вывод для меня:

Color LCD = 2880 x 1800 Retina
DELL 2007WFP = 1920 x 1200 @ 60 Hz

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .