Получить размер экрана Macbook из терминала / Баш

Кто-нибудь знает какой-либо возможный способ определить или получить эту информацию из терминала (для использования в сценарии оболочки bash)?

На моем Macbook Air через GUI я могу перейти к "Об этом mac" > "Дисплеи", и он говорит мне: Встроенный дисплей, 13-дюймовый (1440 x 900)

Я могу получить разрешение экрана от команды system_profiler, но не от 13-дюймового бита. Я также пытался с Ioreg без успеха. Расчет размера экрана по разрешению не является точным, так как он может быть изменен пользователем.

Кому-нибудь удалось этого добиться?

6 ответов

Решение

Я обнаружил, что, кажется, есть несколько разных URL-адресов Apple для проверки этой информации. Некоторые из них, кажется, работают для некоторых серийных номеров, а другие для других машин. например:

https://selfsolve.apple.com/wcResults.do?sn=$ Serial & Continue = Continue & num = 0 https://selfsolve.apple.com/RegisterProduct.do?productRegister=Y&country=USA&id=$ Serial http://support-sp.apple.com/sp/product?cc=$ serial (последние 4 цифры) https://selfsolve.apple.com/agreementWarrantyDynamic.do

Тем не менее, первые два URL-адреса, которые, кажется, работают для меня. Может быть, это потому, что машины, которые я ищу, находятся в Великобритании, а не в США, или, может быть, это из-за их возраста?

В любом случае, из-за того, что мне не очень повезло с curl в командной строке (сайты Apple перенаправляют, иногда несколько раз, на альтернативные URL-адреса, а опция -L, похоже, не помогает), мое решение заключалось в том, чтобы собрать вместе (довольно грязно)) PHP-скрипт, который использует PHP cURL для проверки серийных номеров по обоим URL-адресам, а затем выполняет некоторую хитрость в регулярных выражениях, чтобы сообщить мне необходимую информацию.

Оказавшись на моем веб-сервере, я могу теперь свернуть его из командной строки терминала, и он возвращает достойные результаты в 100% случаев. Я новичок в PHP, поэтому я не буду смущать себя, публикуя скрипт в его текущем состоянии, но если кому-то будет интересно, я буду рад привести его в порядок и поделиться им здесь (хотя по общему признанию, это довольно длинное решение) к чему должен быть очень простой запрос). Эта информация действительно должна быть просто доступна в system_profiler. Поскольку он доступен через System Information.app, я не вижу причины, почему бы и нет.

system_profiler SPDisplaysDataType даст вам физическое разрешение дисплея Retina, но не даст эффективного (масштабированного) разрешения. Если вам это нужно, вы можете получитьosascript:

$ osascript -e 'tell application "Finder" to get bounds of window of desktop'
0, 0, 2048, 1280

Обратите внимание, что если вы используете установку с несколькими мониторами, это может потребовать некоторой интерпретации. Например, у меня Retina iMac 21"с физическим разрешением 4096x2304 и масштабированным разрешением 2560x1440; у меня также есть внешний портретный монитор с разрешением 1440x2560:

┌───────┐┌─────────────┐
│  1440 ││  2560x1440  │
│ x2560 ││             │
│       ││             │
│       │└─────────────┘
│       │
│       │
└───────┘

Когда я запускаю команду выше, она сообщает:

-1440, 0, 2560, 2560

Это границы рабочего стола относительно верхнего левого угла основного монитора:

x = -1440     0          2560
     ┌───────┐┌─────────────┐ y = 0
     │       ││             │ 
     │Monitor││  Monitor 0  │
     │   1   ││             │
     │       │└─────────────┘
     │       │
     │       │
     └───────┘                2560

Как вы можете видеть, это само по себе не дает масштабированного вертикального разрешения основного монитора (хотя вы можете выяснить это из физического соотношения сторон).

Другим вариантом является разрешение экрана утилиты GPL (которое доступно через Homebrew, если вы не хотите создавать его самостоятельно). Командная строка не похожа ни на что другое на этой земле, но она работает:

$ screenresolution get
2018-04-20 10:00:14.935 screenresolution[12084:518367] starting screenresolution argv=screenresolution get 
2018-04-20 10:00:14.938 screenresolution[12084:518367] Display 0: 2560x1440x32@0
2018-04-20 10:00:14.939 screenresolution[12084:518367] Display 1: 1440x2560x32@60

В качестве бонуса он также дает вам глубину цвета в битах и, если возможно, частоту обновления в Гц.

Я думаю, что вы можете получить только название модели дисплея, которое содержит ссылку на размер:

ioreg -lw0 | grep "IODisplayEDID" | sed "/[^<]*</s///" | xxd -p -r | strings -6 | grep '^LSN\|^LP'

выведет что-то вроде:

LP154WT1-SJE1

который зависит от производителя дисплея. Но, как вы видите, первые три числа в этой строке названия модели означают размер экрана: 154 == 15.4''

РЕДАКТИРОВАТЬ

Нашел опрятное решение, но для этого требуется подключение к интернету:

curl -s http://support-sp.apple.com/sp/product?cc=`system_profiler SPHardwareDataType | awk '/Serial/ {print $4}' | cut -c 9-` |
sed 's|.*<configCode>\(.*\)</configCode>.*|\1|'

надеюсь, это поможет

Следующий скрипт:

model=$(system_profiler SPHardwareDataType | \
/usr/bin/perl -MLWP::Simple -MXML::Simple -lane '$c=substr($F[3],8)if/Serial/}{
print XMLin(get(q{http://support-sp.apple.com/sp/product?cc=}.$c))->{configCode}')

echo "$model"

напечатать например:

MacBook Pro (13-inch, Mid 2010)

Или то же самое без Perl, но больше команды разветвления:

model=$(curl -s http://support-sp.apple.com/sp/product?cc=$(system_profiler SPHardwareDataType | sed -n '/Serial/s/.*: \(........\)\(.*\)$/\2/p')|sed 's:.*<configCode>\(.*\)</configCode>.*:\1:')
echo "$model"

Он загружается онлайн с сайта Apple по серийному номеру, поэтому вам нужно подключение к интернету.

Привет, мой сценарий bash под GNU/Linux: я делаю следующее, чтобы сохранить

# Resolution Fix
echo `xrandr --current | grep current | awk '{print $8}'` >> /tmp/width
echo `xrandr --current | grep current | awk '{print $10}'` >> /tmp/height
cat /tmp/height | sed -i 's/,//g' /tmp/height
WIDTH=$(cat /tmp/width)
HEIGHT=$(cat /tmp/height)
rm /tmp/width /tmp/height
echo "$WIDTH"'x'"$HEIGHT" >> /tmp/Resolution
Resolution=$(cat /tmp/Resolution)
rm /tmp/Resolution
# Resolution Fix

и следовать в том же скрипте для восстановления после выхода из какого-либо приложения / игры

в некоторых SO это его команда выполнения напрямую

ResolutionRestore=$(xrandr -s $Resolution)

Но если не выполнить, вызовите переменную с этим, чтобы выполнить переменное содержимое

$($ResolutionRestore)

И еще один способ, которым вы можете попробовать его с помощью следующего, например,

RESOLUTION=$(xdpyinfo | grep -i dimensions: | sed 's/[^0-9]*pixels.*(.*).*//' | sed 's/[^0-9x]*//')
VRES=$(echo $RESOLUTION | sed 's/.*x//')
HRES=$(echo $RESOLUTION | sed 's/x.*//')

Без доступа к сети вы можете получить доступ к информации об оборудовании с помощью system_profilerполезность. Например:

      system_profiler SPHardwareDataType

дает результат, который выглядит так:

      Hardware:
    Hardware Overview:
      Model Name: MacBook Pro
      Model Identifier: MacBookPro15,1
      ...

Или в сценарии вы можете сделать (использует jq):

      system_profiler SPHardwareDataType -json -detailLevel mini | jq -r ".SPHardwareDataType[0].machine_model" | grep -Eo '[0-9,]+$'
Другие вопросы по тегам