作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我需要一个函数来跨多行在终端中显示多个实时数据流的输出。理想的结果将像这样打印到终端:
Measurement 1: ####
Measurement 2: ####
其中 ####
以 1 秒的间隔更新,但其余文本保持在屏幕上。
这个问题已经解决了单行输出here ,但我不知道如何扩展到多行。
这是我目前所拥有的:
function doit {
while :;
do
i=$(current reading from sensor 1)
j=$(current reading from sensor 2)
echo -ne "Measurement 1: $i\nMeasurement 2: $j"'\r';
sleep 1;
done
}
这会导致连续输出仅覆盖终端上的第二行,在每次循环迭代后在终端上创建一个新的输出 block 。
另一种解决方案 here是:
function doit {
while :;
do
i=$(current reading from sensor 1)
j=$(current reading from sensor 2)
echo -ne "Measurement 1: $i\nMeasurement 2: $j"'\r';
sleep 1;
tput cuu1
tput el
tput cuu1
tput el
done
}
这很接近,但会在每次循环后清除终端上显示的所有文本,这会造成令人不快的视觉效果,因为文本 block 在屏幕上闪烁。这将必须起作用,以便有人可以密切监视读数。我需要将其扩展到 5 行或更多行的输出。感谢您提出任何建议,并期待看到一些解决方案!
最佳答案
这是一个试图通过在每行末尾发送删除序列来避免闪烁屏幕的版本(这通常不会删除任何内容,但如果前一行更长的话会有所帮助)。我使用 $RANDOM
来表示“获取测量值”操作,因为这是一个数字,所以我使用 %5d
格式,以便数字在每个周期(这也有助于避免显示伪影)。
function doit {
local up2=$(tput cuu 2)$(tput cr) up=
local endl=$(tput el)$'\n'
while :; do
local i=$RANDOM
local j=$RANDOM
printf "%sMeasurement 1: %5d%sMeasurement 2: %5d%s" "$up" "$i" "$endl" "$j" "$endl"
up=$up2
sleep 1;
done
}
关于linux - 循环回显显示多个变量的 'live update',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41818705/
COW 不是奶牛,是 Copy-On-Write 的缩写,这是一种是复制但也不完全是复制的技术。 一般来说复制就是创建出完全相同的两份,两份是独立的: 但是,有的时候复制这件事没多大必要
我是一名优秀的程序员,十分优秀!