考虑以下代码(用 PHP 编写,但这并不重要。答案可能使用纯 Bash)。目标是用字符填充终端行的整个宽度。
现在,如果你最小化执行过程中终端宽度,必须清除上次多余的字符以避免混乱。
然而,然后,先前回显的行将被分成多行,并且回显\r
会将光标返回到最后的这些行,而不是第一的,留下垃圾。
有什么简单的治疗方法吗?我唯一能想到的就是在断线时多次回显“CURSOR UP”的 ANSI 代码(减一)。
#!/usr/bin/env php
<?php
// Make sure window is 80 characters wide when running script
echo "00000000001111111111222222222233333333334444444444555555555566666666667777777777";
sleep(3); // Narrow window here (to 40-50 characters or so)
echo "\033[2K"; // CLEAR LINE
echo "\033[A"; // CURSOR UP
echo "\033[2K"; // CLEAR LINE
echo "\r"; // GOTO BEGINNING OF LINE
echo "Now we're back were we begun (where 000... used to be)";
?>
答案1
请注意,终端模拟器的“传统”行为是在窗口变窄时截断长行,而某些终端在调整大小时会重新包装其内容。您的问题仅与后一种相关。
“擦除显示”转义序列(命令:tput ed
,序列:\e[J
)清除从光标(包括)到显示末尾的所有内容。这可能是最简单的选择。
但请注意,在打印到一行的最后一列后,光标在逻辑上仍然位于最后一列(即使某些模拟器隐藏它或在其他地方显示它),因此在这种情况下,此转义序列会清除该字符。为了确保不会擦除消息的最后一个字符,您应该在打印新消息之前在光标仍在第一列时发出它。