用echo更新终端中的多行

时间:2019-04-20 10:54:28

标签: bash shell echo

我有一个任务要为我的项目做,我对此主题有点误解。

Objectiv

  • 在终端上打印几行。
  • 实时更新值。

作为测试,我尝试使用reloadData()命令模拟的十行内容,持续30秒。 `

ps
  • 我知道我的代码不干净,我正在尝试学习,所以我访问了console_codes的手册页,发现您必须使用类似#!/bin/bash test=$(ps -ao pid,pcpu,time,comm | head -n10) for time in $(seq 1 30); do echo -ne "$test\r" sleep 1 test=$(ps -ao pid,pcpu,time,comm | head -n10) done 之类的东西才能获取正确的光标位置以更新该行,我对一行没问题,但对于十行我完全迷失了。
  • 我使用了一个变量来刷新一个echo -e " text area \033\r",但我发现我对此问题有误。
  • 如果可能的话,我想为我的示例提供一个解决方案,并说明如何处理多行,因为我的示例在新行上打印,而不会更新/删除旧行。

注意:该示例不是我的任务,但这代表了我现在面临的挑战

感谢您的时间。

2 个答案:

答案 0 :(得分:1)

最简单,最可移植且最稳定的解决方案是在每次迭代时清除屏幕:

#!/bin/bash

for i in {1..30} ; do
    clear

    # Print several lines
    printf "foo %d\n" "${i}"
    printf "bar %d\n" "${i}"

    sleep 1
done

或者,您可以使用以下顺序:

# Save the cursor position
printf "\033[s"
# Print two empty dummy lines
printf "\n\n"

for i in {1..30} ; do
    # Delete the last two lines
    printf "\033[2K"
    # Restore the cursor position
    printf "\033[u"

    # Print two lines
    printf "foo ${i}\n"
    printf "bar ${i}\n"

    sleep 1
done

请注意,上述^^^解决方案仅在事先知道要打印/清除的行数时才有效。

答案 1 :(得分:0)

您可以使用echo -e "\e[nA"向上n行(n应该是整数)。如果所有行的长度都相同,则执行以下操作。

lines=10
for i in {0..30}; do
    ps -ao pid,pcpu,time,comm | head -n${lines}  # print `$lines` lines
    sleep 1
    echo -e "\e[$((${lines}+1))A"                # go `$lines + 1` up
done