Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
仅刷新Bash脚本上的几行_Bash - Fatal编程技术网

仅刷新Bash脚本上的几行

仅刷新Bash脚本上的几行,bash,Bash,这是我的输出 00- 01- Wallet : 123456789123465789 02- 03- -------------------- 04- Server Stats Update: 05- -------------------- 06- Work Units : 0 (cancelled:0 | completed:0) 07- Average Complete Time : 0 08- 09- ------------- 10- Stats Update: 11-

这是我的输出

00-
01-  Wallet : 123456789123465789 
02- 
03- --------------------
04- Server Stats Update:
05- --------------------
06-  Work Units : 0 (cancelled:0 | completed:0) 
07-  Average Complete Time : 0 
08- 
09- -------------
10- Stats Update:
11- -------------
12-  Work Units : 0 (ondemand:0 | precache:0 | paid:0) 
13-  Prize Pool : 0%    -    Earned : 0 
14- 
我需要第06、07、12和13行来保持清新。。。到目前为止,我找到的唯一方法是每两秒钟进行一次循环并清除输出

我还发现,
printf\033[A
可能有用,但我不知道如何在这里实现它

我的代码

while true: do
  echo -e "\n Wallet : ${Address} \n"
  echo --------------------
  echo Server Stats Update:
  echo --------------------
  echo -e " Work Units : ${ServerOverallWU} (cancelled:${Cancelled} | completed:${Completed}) "
  echo -e " Average Complete Time : ${AvgCompTime} "
  echo
  echo -------------
  echo Stats Update:
  echo -------------
  echo -e " Work Units : ${SaveOverallWU} (ondemand:${SaveOnDemand} | precache:${SavePreCache} | paid:${SavePaidWU}) "
  echo -en " Prize Pool : ${SavePrizePool}%   -    Earned : ${SaveEarned} "
done

Ps:修复了…只需将清除设置在右止点,现在它就会像黄油一样平滑运行

如果您想完全控制屏幕,您可能可以在脚本开头清除它,然后使用直接光标寻址只重新绘制屏幕的部分(即,将光标移动到位置1,13;重新绘制该行以替换它;然后移动到第15行并重新绘制该行)但这在纯Bash中会非常难看和痛苦。也许你应该使用像
whiptail
这样的
curses
包装器来屏蔽细节。也许还可以参见我有一个函数用于此

XY () { printf "\e[$2;${1}H$3"; }
用法

它将在第13行的第1列打印“Hello World!”。 将其与
tput

for i in {1..100}; {
    tput cup $1 $2; printf "Hello World!"
}

real    0m0,130s
user    0m0,079s
sys     0m0,055s


for i in {1..100}; {
    XY $1 2 "Hello World!"
}

real    0m0,002s
user    0m0,002s
sys     0m0,000s

请参阅:一旦您在终端上回显某个内容,它就不能真正“刷新”。相反,您是否尝试过您的脚本?@Tané您对“刷新”的定义是什么。许多程序都会执行我称之为“刷新”的操作(例如
top
vim
)。这是一个糟糕的定义,我的不好。请观看甚至回显,例如:
echo-e-n“first\r”;睡眠2;回声“刷新!”
。但我试图给出一个与@anderson code相关的答案。实际上,这纯粹是学术性的,但我要注意的是,终端驱动程序提供了
tput
命令,用于便携式发射屏幕控制代码。除非你对计算机考古学感兴趣,否则硬编码VT100控制代码可能会在几乎所有地方都有效。
for i in {1..100}; {
    tput cup $1 $2; printf "Hello World!"
}

real    0m0,130s
user    0m0,079s
sys     0m0,055s


for i in {1..100}; {
    XY $1 2 "Hello World!"
}

real    0m0,002s
user    0m0,002s
sys     0m0,000s