持续显示最后一行命令输出而不清除屏幕

持续显示最后一行命令输出而不清除屏幕

我想在同一行上连续打印命令输出的最后一行,而不清除屏幕。这将是另一个功能的一部分。假设我的脚本具有以下伪代码:

test_project_local_install(){
  install_project
  setup_venv
  run_tests
}

我想要一个按以下方式使用的命令:

test_project_local_install(){
  printf "Install Project: "
  install_project | magic_command
  printf "Setup Venv: "
  setup_venv | magic_command
  printf "Run Tests: "
  run_tests | magic_command
}

因此test_project_local_install命令输出如下:

$ > test_project_local_install
$ Install Project: install_project updated output on one line
$ Setup Venv: setup_venv updated output on one line
$ Run Tests: run_tests updated output on one line

公认的解决方案这个问题执行我想要的操作,仅连续输出命令的最后几行,但它也会清除屏幕,这不是我想要的。我无法找到一种方法来调整代码。其他建议的答案也不符合我正在寻找的内容。谢谢 !

答案1

最简单的尝试是使用控制字符回车将光标移动到行首,用空格覆盖之前的内容,再次回车并打印下一行。

实际上很容易开始,如以下 Bash 代码所示。 (可以用作单独的脚本或 Shell 函数(但您可能想删除退出行))

#!/usr/bin/env bash

# exit if stdin is connected to terminal (script should filter piped input)
[[ -t 0 ]] && exit 0

: "${COLUMNS:=$(tput cols)}"
clear_str=$'\r'"$(printf "%$((COLUMNS-2))s" ' ')"$'\r'

while IFS= read -r line; do
  printf '%s%s' "$clear_str" "${line:0:$COLUMNS}"
done

对于像这样的管道ping 1.1 | statusline.sh,它显示某种 ping 状态行,该状态行在单行上连续更新。

如果您需要更多,您可能应该开始研究库,例如ncurses制作一个真正的途易

PS:如果您[[ -n "$line" ]] || continue在 while 循环中添加 as 第一个语句,您甚至可以防止空行覆盖最后的状态。

相关内容