Como eu posso ler “preguiçosamente” a saída do xrandr?

5

Eu tenho um script que uso para ajustar o brilho do meu monitor que usa xrandr --verbose para obter o brilho atual. Funciona bem, mas usar xrandr é meio lento na minha máquina, como você pode ver aqui:

[PROMPT REDACTED]$ time xrandr --verbose
# xrandr output omitted for brevity
real    0m0.976s
user    0m0.003s
sys     0m0.002s

Isso gera muitas informações que eu não preciso, além de levar quase um segundo inteiro. A única linha fora da saída que eu realmente preciso é Brightness: X . No momento, estou usando essa linha para obter o valor dela:

BRIGHTNESS='xrandr --verbose | grep -i brightness | cut -f2 -d ' ' | head -n1'

Nota: head é chamado no final porque eu tenho 2 monitores, então eu acabo com 2 valores, mas só preciso de 1, pois eu estou mantendo ambos no mesmo brilho.

Como eu só preciso daquela linha de xrandr --verbose , fiquei me perguntando se existe uma maneira de avaliar "preguiçosamente", fazendo algo como:

  • Parando xrandr de saída quando atinge essa linha
  • Ignorando o restante da saída de xrandr depois que eu li essa linha
  • Algo mais?

Sei que o bash pode não ser o idioma mais adequado para isso, por isso estou aberto a soluções em outros idiomas também.

    
por gla3dr 18.08.2014 / 18:22

4 respostas

6

Vamos tentar e ignorar a primeira descoberta de brigthness . De grep man page:

 -m NUM, --max-count=NUM
          Stop  reading  a  file after NUM matching lines.

Esta é a minha versão final. Note que nem precisamos do head :

BRIGHTNESS='xrandr --verbose | grep -m 1 -i brightness | cut -f2 -d ' ''
    
por 18.08.2014 / 18:42
6

Você pode usar awk para remover alguns pipelines (processos) e ler apenas o arquivo até encontrar a primeira instância do Brightness:

xrandr --verbose | awk '/Brightness/ { print $2; exit }'
    
por 18.08.2014 / 19:29
5

Além da sugestão do @ LatinSuD de usar grep -m flag para parar a leitura após uma correspondência, é possível ajustar o tamanho do buffer de stdout de xrandr com uma ferramenta como stdbuf assim:

BRIGHTNESS='stdbuf -o0 xrandr --verbose | grep -m 1 -i brightness | cut -f2 -d ' ''

Isso pode aumentar significativamente a velocidade:

$ cat brightness
xrandr --verbose | grep -m 1 -i brightness | cut -f2 -d ' '

$ time sh brightness > /dev/null
sh brightness > /dev/null  0.00s user 0.00s system 1% cpu 0.485 total

$ cat brightness_nobuffer
stdbuf -o0 xrandr --verbose | grep -m 1 -i brightness | cut -f2 -d ' '

[ para ~ . ]$ time sh brightness_nobuffer > /dev/null
sh brightness_nobuffer > /dev/null  0.01s user 0.01s system 10% cpu 0.130 total
    
por 18.08.2014 / 18:59
1

Sugiro que você instale o programa xbacklight .

É claro que, se o seu hardware não suportar, isso não é uma opção. Então você deve recorrer ao ajuste de software como você tem feito:

man xrandr 2>/dev/null |
grep '^ *--brightness' -A8
   --brightness brightness
          Multiply the gamma values on the  crtc  cur‐
          rently  attached  to the output to specified
          floating value. Useful for overly bright  or
          overly  dim  outputs.   However,  this  is a
          software only modification, if your hardware
          has  support  to actually change the bright‐
          ness, you will probably prefer to use xback‐
          light.

Parece que a configuração de brilho não é nada além de um multiplicador para os valores RGB gama do seu monitor. Como tal, pode fazer mais sentido - ou, pelo menos, pode ser mais fácil - se você, ao invés disso, afetou diretamente isso com xgamma .

xgamma
-> Red  1.000, Green  1.000, Blue  1.000

xgamma -gamma .7
-> Red  1.000, Green  1.000, Blue  1.000
<- Red  0.700, Green  0.700, Blue  0.700

Na mesma linha de muitas outras respostas, você pode sair da entrada com sed assim que encontrar uma sequência de Brilho , como:

xrandr --verbose | sed '/Br/!d;s/.* //;q'

Isso exclui todas as linhas antes da primeira ocorrência da string Br . Quando ele encontrar um, ele remove tudo até e incluindo o último <space> da linha antes de sair imediatamente da entrada. Então, tudo o que resta em um caso de 100% de brilho é, por exemplo:

echo "<$(xrandr --verbose | sed '/Br/!d;s/.* //;q')>"
<1.0>

Seria muito melhor se você pudesse obter um EDID válido em sua saída e afetar diretamente sua luz de fundo com a seguinte ferramenta:

man xbacklight 2>/dev/null | 
sed '/^ *SYNOPSIS/,/^ *-inc/!d;//c\'

       xbacklight [-help]  [-display display] [-get] [-set
       percent] [-inc percent] [-dec percent]

DESCRIPTION
       Xbacklight  is used to adjust the backlight bright‐
       ness where supported. It finds all outputs on the X
       server  supporting backlight brightness control and
       changes them all in the same way.

       -get   Print out the current  backlight  brightness
              of  each  output  with  such  a control. The
              brightness is represented as a percentage of
              the maximum brightness supported.

       -set percent
              Sets each backlight brightness to the speci‐
              fied level.

Aparentemente já está instalado na minha máquina porque, em algum momento eu instalei ...

pacman -Qo /usr/bin/xbacklight
/usr/bin/xbacklight is owned by xorg-xbacklight 1.2.1-1

... ^ esse pacote.

    
por 18.08.2014 / 23:00