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
扩大。