gla*_*3dr 7 display-settings shell-script text-processing
我有一个 bash 脚本,用于调整xrandr --verbose用于获取当前亮度的显示器亮度。它工作正常,但xrandr在我的机器上使用有点慢,正如你在这里看到的:
[PROMPT REDACTED]$ time xrandr --verbose
# xrandr output omitted for brevity
real 0m0.976s
user 0m0.003s
sys 0m0.002s
Run Code Online (Sandbox Code Playgroud)
这会输出很多我不需要的信息,此外还需要将近一秒钟的时间。我实际需要的输出中唯一的一行是Brightness: X. 我目前正在使用此行从中获取值:
BRIGHTNESS=`xrandr --verbose | grep -i brightness | cut -f2 -d ' ' | head -n1`
Run Code Online (Sandbox Code Playgroud)
旁注:head最后调用是因为我有 2 个显示器,所以我最终得到 2 个值,但只需要 1 个,因为我将它们保持在相同的亮度。
由于我只需要来自 的那一行xrandr --verbose,我想知道是否有一种方法可以通过执行以下操作来“懒惰”地评估它:
xrandr一旦到达该行就停止输出xrandr一旦我阅读了该行,就忽略其余的输出我意识到 bash 可能不是最适合这个的语言,所以我也愿意接受其他语言的解决方案。
您可以使用awk删除一些管道(进程)并仅读取文件直到遇到第一个亮度实例:
xrandr --verbose | awk '/Brightness/ { print $2; exit }'Run Code Online (Sandbox Code Playgroud)
让我们尝试停止并忽略第一个找到的brigthness. 从grep手册页:
-m NUM, --max-count=NUM
Stop reading a file after NUM matching lines.
Run Code Online (Sandbox Code Playgroud)
这是我的最终版本。请注意,我们甚至不需要head:
BRIGHTNESS=`xrandr --verbose | grep -m 1 -i brightness | cut -f2 -d ' '`
Run Code Online (Sandbox Code Playgroud)
小智 6
除了@LatinSuD 建议使用grep's-m标志在匹配后停止读取之外,您还可以xrandr使用如下工具调整's stdout 缓冲区的大小stdbuf:
BRIGHTNESS=`stdbuf -o0 xrandr --verbose | grep -m 1 -i brightness | cut -f2 -d ' '`
Run Code Online (Sandbox Code Playgroud)
这可以显着提高速度:
$ 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
Run Code Online (Sandbox Code Playgroud)