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 useised
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