我想在同一行上连续打印命令输出的最后一行,而不清除屏幕。这将是另一个功能的一部分。假设我的脚本具有以下伪代码:
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 第一个语句,您甚至可以防止空行覆盖最后的状态。