Comment puis-je lire "paresseusement" la sortie de xrandr?

J'ai un script bash que j'utilise pour ajuster la luminosité de mon moniteur qui utilise xrandr --verbose pour get la luminosité actuelle. Cela fonctionne bien, mais utiliser xrandr est un peu lent sur ma machine, comme vous pouvez le voir ici:

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

Cela produit beaucoup d'informations dont je n'ai pas besoin, en plus de prendre presque une seconde complète. La seule ligne de sortie dont j'ai réellement besoin est Brightness: X J'utilise actuellement cette ligne pour en tirer la valeur:

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

Note de côté: la head est appelée à la fin parce que j'ai 2 moniteurs, donc je me retrouve avec 2 valeurs, mais j'ai seulement besoin de 1, puisque je les garde toutes les deux à la même luminosité.

Puisque je n'ai besoin que d'une seule ligne de xrandr --verbose , je me demandais s'il était possible de l'évaluer «paresseusement» en faisant quelque chose comme:

  • Arrêt de la sortie xrandr une fois qu'il atteint cette ligne
  • Ignorer le rest de la sortie de xrandr une fois que j'ai lu cette ligne
  • Autre chose?

Je me rends count que bash peut ne pas être la langue la mieux adaptée à cela, donc je suis ouvert aux solutions dans d'autres langues.

Essayons d'arrêter et d'ignorer la première trouvaille de brigthness . De la page man de grep :

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

Ceci est ma version finale. Notez que nous n'avons même pas besoin de la head :

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

Vous pouvez utiliser awk pour supprimer certains pipelines (process) et lire uniquement le file jusqu'à la première occurrence de Luminosité:

 xrandr --verbose | awk '/Brightness/ { print $2; exit }' 

En plus de la suggestion de @ LatinSuD d'utiliser le drapeau -m grep pour arrêter la lecture après une correspondance, vous pouvez ajuster la taille du xrandr stdout de xrandr avec un outil comme stdbuf comme ceci:

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

Cela peut vous donner une augmentation de vitesse significative:

 $ 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 

Je vous suggère d'installer le programme xbacklight .

Bien sûr, si votre matériel ne le supporte pas, ce n'est pas une option. Vous devez donc recourir à l'ajustement du logiciel comme vous l'avez fait:

 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. 

Il semblerait que la luminosité ne soit rien de plus qu'un multiplicateur pour les valeurs gamma RVB de votre écran. En tant que tel, cela pourrait avoir plus de sens – ou, du less, cela pourrait être plus facile – si vous l'avez plutôt directement touché avec 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 

Dans la même veine que de nombreuses autres réponses, vous pouvez quitter l'input avec sed dès que vous rencontrez une string de luminosité comme:

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

Cela supprime toutes les lignes avant la première occurrence de la string Br . Quand il en trouve un, il supprime tout jusqu'au dernier <space> de la ligne avant de quitter immédiatement l'input. Donc, tout ce qui rest dans un cas de luminosité à 100% est, par exemple:

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

Ce serait bien mieux si vous pouviez get un EDID valide sur votre sortie et affecter directement son rétroéclairage avec l'outil suivant:

 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. 

Il est apparemment déjà installé sur ma machine car, à un moment donné, j'ai installé …

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

… ^ ce package.