다음 코드를 고려해보세요(PHP로 작성되었지만 그것은 중요하지 않습니다. 대답은 아마도 순수한 Bash일 것입니다). 목표는 터미널 라인의 전체 너비를 문자로 채우는 것입니다.
이제 당신이최소화하다터미널 너비를 실행하는 동안 혼동을 피하기 위해 마지막 실행에서 초과된 문자를 지워야 합니다.
그러나 이전에 에코된 줄은 여러 줄로 분할되고 에코는 \r
커서를 다음으로 반환합니다.마지막대신 이 줄은첫 번째, 쓰레기를 남기고 있습니다.
간단한 치료법은 없나요? 내가 생각할 수 있는 유일한 것은 연결이 끊어졌을 때 "CURSOR UP"을 여러 번 에코하는 ANSI 코드(마이너스 1)입니다.
#!/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
)는 커서(포함)부터 디스플레이 끝까지 모든 내용을 지웁니다. 이것은 아마도 가장 쉬운 옵션 일 것입니다.
그러나 줄의 마지막 열에 인쇄한 후에도 커서는 여전히 논리적으로 마지막 열에 있으므로(일부 에뮬레이터가 커서를 숨기거나 다른 곳에 표시하더라도) 이 경우 이 이스케이프 시퀀스는 문자를 지웁니다. 메시지의 마지막 문자가 지워지지 않도록 하려면 새 메시지를 인쇄하기 전에 커서가 첫 번째 열에 있는 동안 메시지를 내보내야 합니다.