Determine e use a resolução como uma variável no script UNIX no Mac

2

Estou implantando uma imagem do NetRestore em vários tipos de Mac: MacBooks, MacBook Pros, Mac Pros, iMacs e Mac Minis. Tenho várias telas de login personalizadas que gostaria de usar, mas tudo o que é necessário antes de 10.10 exige que você saiba a resolução do monitor. Caso contrário, o plano de fundo de login não será exibido corretamente.

Existe uma maneira de usar a saída deste código como uma variável para uma série de if / then declarações?

system_profiler SPDisplaysDataType |grep Resolution

A saída normal é exibida assim

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

(Isso se você tiver três monitores ... prefiro usar o primeiro resultado).

Minha intenção é que o script seja executado ao vincular o Mac ao Active Directory - o que deve ser feito manualmente - para que a resolução já esteja disponível. Ele selecionaria a imagem de resolução correta e depois a copiaria no local desejado.

Ou por acaso alguém tem alguma boa idéia sobre como criar fundos de janela de login personalizados e fundos de usuário para trabalhar em qualquer tipo de Mac com qualquer resolução como o sistema operacional faz quando você seleciona “Fit to Screen” em System Preferences?

    
por ghostof101 25.02.2015 / 18:46

1 resposta

2

Existem muitas maneiras de fazer isso, mas se você quiser ficar apenas / principalmente bash, aqui estão duas abordagens.

  • system_profiler tem uma opção para saída para XML. Use isso para colocar a saída em uma variável ou arquivo, assim, certificando-se de incluir as aspas duplas:

    someVar="$(system_profiler SPDisplaysDataType -xml)"
    
  • Isso retorna uma matriz em _items chamada _IODisplayEDID , que lista o nome de exibição como _name e a resolução como _IODisplayEDID

  • Se você está comprometido / obrigado a mantê-lo no bash, aqui está uma boa resposta no StackOverflow.com para Como analisar XML no bash que eu não vou reesh. Mas, neste ponto, você deve considerar o uso de um XMLStartlet de analisador de XML ou xsltproc , incluído no Xcode Dev Tools.

Tudo o que disse, você ainda pode ir a rota grep , mas tem que fazer alguma suposição sobre o comprimento total da saída e a colocação de "Resolução" para a exibição que você está interessado. Aqui está um teste bruto baseado no meu sistema de exibição 2:

  • Primeiro, obtenha os nomes para exibição. Para contabilizar os espaços no nome, você pode redefinir temporariamente o $ IFS para usar apenas uma nova linha e usar grep -A para obter 50 linhas (uma estimativa) depois de "Exibições", não retornar a primeira linha e obter os valores de nome, uma vez que eles terminam em : ( isso é um monte de suposições para fazer! )

    IFStemp=${IFS}
    IFS=$'\n'
    var=($(system_profiler SPDisplaysDataType|grep -A 50 \ Displays|grep -v Displays|egrep ':$'))
    
  • Use isso para saber onde "Resolution" será. Você pode obviamente sub printf para um nome de variável, mas eu queria mostrar a saída. Eu usei sed para aparar os espaços iniciais.

    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
    
  • Agora restaure você $ IFS

    IFS=${IFStemp}
    unset IFStemp
    

E aqui está o resultado para mim:

Color LCD = 2880 x 1800 Retina
DELL 2007WFP = 1920 x 1200 @ 60 Hz
    
por 25.02.2015 / 23:57