如何“懒惰”地读取 xrandr 的输出?

如何“懒惰”地读取 xrandr 的输出?

我有一个 bash 脚本,用于调整显示器亮度,用于xrandr --verbose获取当前亮度。它工作正常,但xrandr在我的机器上使用有点慢,正如您在这里看到的:

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

除了花费几乎一整秒的时间之外,这还输出了大量我不需要的信息。我实际需要的输出中唯一的一行是Brightness: X.我目前正在使用这一行来从中获取值:

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

旁注:head在最后调用,因为我有 2 个显示器,所以我最终得到 2 个值,但只需要 1 个,因为我将它们保持在相同的亮度。

由于我只需要来自 的一行xrandr --verbose,我想知道是否有一种方法可以“懒惰”地评估它,通过执行以下操作:

  • xrandr一旦到达该行就停止输出
  • xrandr一旦我读完该行,就忽略其余的输出
  • 还有别的事吗?

我意识到 bash 可能不是最适合这种情况的语言,因此我也愿意接受其他语言的解决方案。

答案1

您可以使用awk删除一些管道(进程)并仅读取文件,直到遇到亮度的第一个实例:

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

答案2

让我们尝试在第一次发现 时停止并忽略brigthness。从grep手册页:

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

这是我的最终版本。请注意,我们甚至不需要head

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

答案3

除了 @LatinSuD 建议使用grep's标志在比赛后停止读取之外,您还可以使用类似工具-m调整 's stdout 缓冲区的大小xrandrstdbuf像这样:

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

答案4

我建议你安装该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在遇到问题时立即退出输入亮度字符串如:

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

这会删除第一次出现之前的所有行细绳。当它找到一个时,它会删除该行中直到并包括最后一个的所有内容<space>,然后立即退出输入。因此,在 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

...^那个包裹。

相关内容