일종의 부정적인 에코와 함께 이전 에코와 동일한 위치에 콘솔에 무언가를 인쇄합니다.

일종의 부정적인 에코와 함께 이전 에코와 동일한 위치에 콘솔에 무언가를 인쇄합니다.

clearBash에서는 모든 화면 지우기 명령이라는 명령을 실행할 수 있습니다.

echo화면에 원하는 내용을 인쇄할 수 있습니다 .

간단한 스크립트에서는 명령 실행 비율을 인쇄해야 하는 경우가 많습니다.

그래서 나는 다음과 같은 일을 할 수 있습니다 ...

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

등..

내가 싫어하는 것은 화면이 전체 비율로 업데이트되는 것입니다...

89%
90%
91%
...

bash 또는 php echo로 에코하고 콘솔에 "마지막으로 인쇄된 문자를 제거하세요.."라고 알릴 수 있는 특별한 문자 조합(예: "\033[01;31m")이 있는지 궁금합니다.

다음과 같은 것을 사용하여 이를 수행하십시오: (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줄 끝 부분까지 지우는 데 사용됩니다 (터미널이 이러한 시퀀스를 지원한다고 가정).

tputprintf이러한 시퀀스에 액세스할 수 있는 터미널 독립적인 방법을 제공합니다 .

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 스크립트의 유사한 화면 제어를 보려면 PECL을 확인하세요.ncurses확장하다.

관련 정보