在控制台中与前一个回显相同的位置打印一些内容,并带有某种负回显

在控制台中与前一个回显相同的位置打印一些内容,并带有某种负回显

clear在 bash 中,您可以投射名为清除所有屏幕命令的命令。

echo可以在屏幕上打印任何您想要的内容。

在我的简单脚本中,我经常需要打印命令执行情况的百分比。

所以我可以做一些像..

echo "89%"
echo "90%"
echo "91%"

等等..

我讨厌的是让屏幕充满百分比更新......

89%
90%
91%
...

我想知道是否有特殊的字符组合(例如“\033[01;31m”)可以用 bash 或 php echo 进行回显,并告诉控制台“删除最后一个打印的字符..”

通过使用类似的方法来做到这一点:(php 示例)

echo str_repeat($neg_character, strlen($last_percentage_update_string));
echo $new_percentage_update_string;

我会将新字符串打印在前一个字符串的确切位置,而不会让屏幕充满行

否则,我会寻找一种始终使用 bash 和 php 脚本以其他方式执行相同操作的方法(请至少包含使用 debian9 控制台和 php7 的实际工作示例)

答案1

执行此操作的典型方法不是删除单个字符,而是使用回车符 ( ) 返回到行的开头\r

printf "89%%"; sleep 1; printf "\r90%%\n"

请注意,这不会清除该行,因此如有必要,您需要注意这一点。简单的选项是在末尾添加空格,或使输出固定宽度(例如printf "%2d%%\n" 1给出前导空格)。

有终端转义,可以让你四处移动并清除屏幕的某些部分,CSI序列,但它们依赖于终端(尽管实际上现在到处都支持 VT100 转义)。例如

printf "89%%"; sleep 1; printf "\e[3D90%%\n"

用于␛[3D向左移动三个字符,并覆盖它们(假设您printf支持\e);

printf "89%% hello"; sleep 1; printf "\e[0E\e[K90%%\n"

用于␛[0E移动到当前行的开头,并␛[K清除到行尾(假设您的终端支持这些序列)。

tput提供了一种与终端和printf不可知的方式来访问这些序列:

printf "89%%"; sleep 1; tput cub 3; tput el; printf "90%%\n"

将光标向左移动三次 ( cub 3) 并清除到行尾 ( el),使用适合当前终端的任何字符序列;

printf "89%% hello"; sleep 1; tput hpa 0; tput el; printf "90%%\n"

会将光标移动到最左边的列 ( hpa 0) 并清除到行尾。

man terminfo会告诉您要使用什么“功能名称” tput

(请注意,上述示例中的许多细节都假设所有输出都在同一行。它们并不是万无一失的,只是为了说明各种方法。)

对于 PHP 脚本中的类似屏幕控制,您可以查看 PECLncurses扩大。

相关内容