我有一个 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 缓冲区的大小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
答案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
...^那个包裹。