我的脚本有一个简单的问题,我需要在同一屏幕中显示行脚本,并且不显示上面的最后信息,请参阅我的演示代码:
#!/bin/bash
if [ -t 0 ]; then stty -echo -icanon -icrnl time 0 min 0; fi
#result=`sensors -A`
count=0
keypress=''
echo -ne "linha 1\nLinha 2\n " > /tmp/temp_script.log
while [ "x$keypress" = "x" ]; do
clear
let "count++"
output="$(cat /tmp/temp_script.log)"
printf "$output"\\b
echo -en $count\\n
sleep 1
keypress="`cat -v`"
done
if [ -t 0 ]; then stty sane; fi
exit 0
结果代码:
我需要以不生成第一个示例的多行的方式显示此信息,并仅显示相关信息的循环,如第二个示例所示:
我怎样才能做到这一点:
依此类推,因此终端上不会有以前的循环印象,只有现在正在打印的内容。
答案1
假设clear
真正清除屏幕,那么显示的脚本本身将不会生成第一个屏幕截图。如果你有一个额外的进程附加到/tmp/temp_script.log
,那么它可以做一些事情......
另一方面,如果您的终端没有清除屏幕,那就是问题的一部分。也许那条彩色线是您运行脚本的提示符,您可能希望将其保留在屏幕顶部:
- 通常您会设置
TERM
一个与终端描述相对应的合适值。 - “合适的”终端描述告诉如何清除屏幕。
- 作为副作用,清除屏幕(按照惯例)也会将光标移动到屏幕的左上角,但是
- 从屏幕左上角清除屏幕也会清除彩色线(您可以可能想保留)
- 如果你想从第二行清除,你可以(在大多数终端上)这样做
printf '\033[2H\033[J''
或者
输出杯 1 0 tput 编辑
- 但请记住,如果您的提示最初不在屏幕顶部,那么这只会留下任何内容曾是在屏幕顶部未触及。
问题的另一部分是这三行被重复打印,沿着屏幕向下延伸。您可以更改它以将光标移动到要打印计数器的位置,例如,
printf '\033[4H'
或者
输出杯 3 0
将它们放在一起,您的脚本可能如下所示(并使用,因为您和/或终端描述printf
似乎有问题):TERM
#!/bin/bash 如果[-t 0];然后 stty -echo -icanon -icrnl 时间 0 分钟 0;菲 #结果=`传感器-A` 计数=0 printf '\033[2H\033[J'' 按键='' 回声“林哈1” 回声“林哈2 while [ "x$keypress" = "x" ];做 让“数++” printf '\033[4H' 回显$计数 睡觉 1 按键=“`猫-v`” 完毕 如果[-t 0];然后精神正常;菲 出口0
进一步阅读: