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

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 可能不是最适合这个的语言,所以我也愿意接受其他语言的解决方案。

jas*_*yan 7

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

xrandr --verbose | awk '/Brightness/ { print $2; exit }'
Run Code Online (Sandbox Code Playgroud)


Lat*_*SuD 6

让我们尝试停止并忽略第一个找到的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)