Как я могу “лениво” считать вывод из xrandr?

Почему бы не использовать обоих:

(Требует удара 4),

#!/usr/bin/env bash
t(){ type "$1"&>/dev/null;}
function Menu.Show {
   local DIA DIA_ESC; while :; do
      t whiptail && DIA=whiptail && break
      t dialog && DIA=dialog && DIA_ESC=-- && break
      exec date +s"No dialog program found"
   done; declare -A o="$1"; shift
   $DIA --backtitle "${o[backtitle]}" --title "${o[title]}" \
      --menu "${o[question]}" 0 0 0 $DIA_ESC "$@"; }



Menu.Show '([backtitle]="Backtitle"
            [title]="Title"
            [question]="Please choose:")'          \
                                                   \
            "Option A"  "Stuff...."                \
            "Option B"  "Stuff...."                \
            "Option C"  "Stuff...."    
5
21.08.2014, 02:53
5 ответов

Попробуем остановиться и проигнорировать первое обнаружение brigthness. Из grep man page:

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

Это моя окончательная версия. Обратите внимание, что нам даже не нужна головка:

BRIGHTNESS=`xrandr --verbose | grep -m 1 -i brightness | cut -f2 -d ' '`
6
27.01.2020, 20:31

Вы можете использовать awk , чтобы удалить некоторые конвейеры (процессы) и только читать файл, пока не встретите первый экземпляр Яркости:

xrandr --verbose | awk '/Brightness/ { print $2; exit }'
6
27.01.2020, 20:31

В дополнение к предложению @LatinSuD использовать флаг grep -m для остановки чтения после совмещения, вы можете настроить размер stdout-буфера xrandr с помощью такого инструмента, как stdbuf :

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

Это может дать значительное увеличение скорости:

$ 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
5
27.01.2020, 20:31

Предлагаю установить программу xbacklight .

Конечно, если ваше аппаратное обеспечение не поддерживает ее, это не вариант. Поэтому Вы должны прибегнуть к настройке программного обеспечения, как Вы это делали:

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.

Похоже, что настройка яркости является не более чем умножением значений RGB гамма-излучения Вашего дисплея. Таким образом, это может иметь больший смысл - или, по крайней мере, может быть проще - если Вы вместо этого непосредственно повлияете на это с помощью 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

В том же ключе, что и многие другие ответы, Вы можете выйти из входа с помощью sed, как только столкнетесь со строкой Brightness типа:

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

, которая удаляет все строки до первого появления строки Br. Когда она находит одну из них, то удаляет все до последнего <пробела> из строки до момента немедленного выхода из входа. Таким образом, все, что остается в случае 100% яркости, это, например:

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

Было бы гораздо лучше, если бы вы могли получить действительный EDID на вашем выходе и напрямую влиять на его подсветку с помощью следующего инструмента:

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.

Он, очевидно, уже установлен на моей машине, потому что, в какой-то момент я установил....

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

...^ этот пакет.

1
27.01.2020, 20:31

Самый медленный шаг:xrandr --verbose. Таким образом, если вам не нужно было выбирать яркость с помощью xrandr --verboseкаждый раз, когда вы пытаетесь отрегулировать яркость, проблема будет решена.

Этого можно добиться с помощью следующего рабочего процесса:

  1. Экспортировать текущую яркость один -раз (желательно, при запуске -до )с помощью:echo `xrandr --verbose | grep -m 1 -i brightness | cut -f2 -d ' '` > brightness.txt
  2. И каждый раз, когда вам нужна яркость, читайте ее изbrightness.txt
  3. И каждый раз, когда вы обновляете яркость, также обновляйте значение вbrightness.txt

Например, так я обновляю яркость:

#!/bin/bash

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

BRIGHT=`cat brightness.txt`

if [ "$1" = '+' ]; then
    NEWBRIGHT=$(echo "$BRIGHT + 0.05" | bc)
    if [ "$(echo "$NEWBRIGHT > 1.0" | bc)" -eq 1 ]; then
        NEWBRIGHT='1.0'
    fi
elif [ "$1" = '-' ]; then
    NEWBRIGHT=$(echo "$BRIGHT - 0.05" | bc)
    if [ "$(echo "$NEWBRIGHT < 0.0" | bc)" -eq 1 ]; then
        NEWBRIGHT='0.0'
    fi
fi

xrandr --output eDP-1 --brightness "$NEWBRIGHT"
echo "${NEWBRIGHT}" > brightness.txt
1
27.01.2020, 20:31

Теги

Похожие вопросы