사용자 입력 후 텍스트가 사라지도록 만들기

사용자 입력 후 텍스트가 사라지도록 만들기

사용자가 콘텐츠를 입력하자마자 표시된 콘텐츠를 사라지게 하는 방법이 있나요?

예를 들어 다음 파일을 사용하세요.

#!/bin/bash
read -n 1 -p 'how are you ? ' var
if [ "$var" == "y" ]
then
    echo 'Have fun'
else
    echo 'Go to Doctor'
fi

이것을 실행하면 출력은 다음과 같습니다.

how are you ? yHave fun

how are you ?사용자가 키를 누르자마자 사라질 수 있는 것을 찾고 있습니다.

그런 다음 사라진 후 인쇄하십시오.Have fun

그래서 나는 위 프로그램의 최종 출력이 다음과 같기를 원합니다.

Have fun

참고: 또한 쉘 화면에 인쇄된 이 스크립트 위에 있는 내용은 삭제하면 안 됩니다.

나는 사용하고있다bash

답변1

캐리지 리턴( \r)을 사용하세요. 이 특수 문자(기계식 타자기 시절의 문자)는 커서를 줄의 시작 부분으로 다시 이동시킵니다. 그런 다음 삭제하려는 메시지만큼 많은 공백이 필요하고(이렇게 하면 메시지가 덮어쓰여집니다) 다음 메시지를 인쇄하기 전에 두 번째 캐리지 리턴을 사용하여 처음으로 돌아갑니다. 이 같은:

#!/bin/bash
echo foo
read -n 1 -p 'how are you ? ' var
if [ "$var" == "y" ]
then
    printf '\r                \rHave fun\n'
else
    printf '\r                \rGo to Doctor\n'
fi

위 스크립트를 실행하면 다음이 인쇄됩니다.

$ foo.sh
foo
Have fun        

답변2

당신은 그것을 사용할 수 있습니다 :

tput cr

(또는 printf '\r') 커서를 줄의 시작 부분으로 이동합니다. 다음은:

tput el

줄 끝까지 모두 삭제합니다. ( tcsh그리고 동등한 기능과 함께 사용할 수 있는 내장 함수 zsh도 있습니다 : (또한 ) )echotctermcapterminfo elechotc ceechoti elzsh

답변3

이를 수행하는 방법은 바보 방지부터 우아한 것까지 다양합니다.

(가장 힘들긴 하지만) 가장 확실한 방법은 백스페이스, 스페이스, 백스페이스를 누르고 여러 번 반복하는 것입니다. 이 방법은 텔레타이프라이터를 제외한 모든 장치에서 작동합니다(종이에서 잉크를 제거하는 것은 어려운 일입니다).

다음 비율은 캐리지 리턴 공간과 캐리지 리턴입니다. 이것은 각 캐리지 리턴 앞이나 뒤에 줄 바꿈을 삽입하는 터미널 에뮬레이터에서는 작동하지 않습니다(이것은 minicom에 대한 옵션이며 다른 장치에서는 이를 갖도록 구성될 수 있습니다).

그런 다음 터미널별 트릭이 있습니다. termcap 및 terminfo 데이터베이스가 사용법을 표시할 수 있으므로 termcap 기능 코드만 언급하겠습니다.(목록입니다.)

단일 행의 경우 간단합니다. 열(ch)로 이동하고 행 끝(ce)까지 지우면 됩니다.

여러 줄 응답을 포함한 더 복잡한 경우에는 절대 위치 저장(sc), 프롬프트, 응답 읽기, 커서 위치 복원(rc), 화면 끝까지 지우기(cd)가 있습니다.

대부분의 경우 대부분의 터미널 에뮬레이터가 호환되므로 마지막 두 답변의 vt100 값을 하드코딩할 수 있습니다. 물론 모든 터미널이 이러한 옵션을 지원하는 것은 아니지만 지원하는 터미널은 드물고 쓸모가 없습니다.

관련 정보