在前一个回声的同一位置在控制台中打印一些东西,带有一种负面回声

use*_*548 9 linux bash php console

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

并与echo您可以打印你想要的任何屏幕上..

在我的简单脚本中,我经常需要打印我的命令所做的工作的百分比。

所以我可以做类似的事情..

echo "89%"
echo "90%"
echo "91%"
Run Code Online (Sandbox Code Playgroud)

等等..

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

89%
90%
91%
...
Run Code Online (Sandbox Code Playgroud)

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

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

echo str_repeat($neg_character, strlen($last_percentage_update_string));
echo $new_percentage_update_string;
Run Code Online (Sandbox Code Playgroud)

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

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

Ste*_*itt 25

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

printf "89%%"; sleep 1; printf "\r90%%\n"
Run Code Online (Sandbox Code Playgroud)

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

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

printf "89%%"; sleep 1; printf "\e[3D90%%\n"
Run Code Online (Sandbox Code Playgroud)

用于?[3D向左移动三个字符,并在它们上面写入(假设您printf支持\e);

printf "89%% hello"; sleep 1; printf "\e[0E\e[K90%%\n"
Run Code Online (Sandbox Code Playgroud)

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

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

printf "89%%"; sleep 1; tput cub 3; tput el; printf "90%%\n"
Run Code Online (Sandbox Code Playgroud)

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

printf "89%% hello"; sleep 1; tput hpa 0; tput el; printf "90%%\n"
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

  • 通常可以使用 `tput cub 3` 将 **cu**rsor **b**back 移动 3 列,而无需对序列进行硬编码(并且使用 `tput el` 来 **e**rase **l **ine)。 (5认同)