새 줄을 쓰는 대신 터미널의 줄 내용을 변경하는 방법은 무엇입니까?


24

따라서 wget웹 페이지를 받으면 파일 다운로드 량을 나타내는 상태 표시 줄이 표시됩니다. 다음과 같이 보입니다 :

25%[=============>______________________________________] 25,000 100.0K/s (밑줄은 공백입니다. 여기에서 연속 공백을 두 개 이상 얻는 방법을 알 수 없었습니다)

그러나 stdout에 다른 줄을 쓰고 다른 진행률 표시 줄을 추가하는 대신 다음과 같이 업데이트합니다.

50%[===========================>________________________] 50,000 100.0K/s

그리고 wget이것의 유일한 예는 아닙니다. 예를 들어, 무언가를 파이프로 연결 less한 다음 종료해도 이전에 실행 한 명령의 결과와 함께 원래 프롬프트가 그대로 있습니다. 당신이 떠난 적이 없어요.

그래서 내 질문은, 이것이 무엇이며 어떻게 구현합니까, 한 번에 한 줄에서만 작동합니까? C에서 사용할 수 있습니까?


5
BashFAQ 44를 읽는 것이 좋습니다 . 흥미로울 수 있습니다.
jw013

답변:


32

우선 귀하의 질문은 bash와 관련이 없지만 터미널과 관련이 있습니다. 터미널은 프로그램의 텍스트를 표시하기 위해 응답하고 있으며 bash 자체는 일단 시작된 프로그램을 제어하지 않습니다.

터미널은 색상, 글꼴, 커서 위치 등을 제어하기위한 제어 순서를 제공합니다. 표준화 터미널 시퀀스의 목록을 살펴 가지고 http://www.termsys.demon.co.uk/vtansi.htm 당신은 예를 들어 수를

  • 줄의 시작 부분에 커서를 놓습니다
  • 나중에 줄을 삭제
  • 새로운 줄을 쓰다

진행률 표시 줄을 만듭니다.

보다 고급의 터미널 이스케이프 시퀀스는 일반적으로 터미널에 의존합니다 (예 : Eterm 또는 xterm에서만 작동). ncurses- 터미널과 대화식 프로그램을 작성하여 이스케이프 시퀀스를 사용할 필요가없는 프로그래밍 라이브러리입니다.

터미널 시퀀스로 기존 줄을 덮어 쓰는 방법

echo long text
sleep 1
printf "\033[1A"  # move cursor one line up
printf "\033[K"   # delete till end of line
echo foo

터미널 시퀀스없이 기존 줄을 덮어 쓰는 방법

간단한 해결책 중 하나는 끝에 줄 바꿈을 쓰지 않고 캐리지 리턴을 쓰면 기본적으로 커서가 줄의 시작 부분으로 재설정됩니다.

echo -n first 
sleep 1 
echo -ne "\rsecond"
echo

\r또는 캐리지 리턴은 줄의 시작 부분에 커서를 놓고 당신이 라인의 내용을 덮어 쓸 수있게됩니다.

less또는 같은 버퍼 간 전환vi

동작은 less고급 터미널 기능인 대체 화면으로 인해 발생합니다.

VT102 모드에는 대체 화면 버퍼를 활성화 및 비활성화하는 이스케이프 시퀀스가 ​​있으며, 이는 창의 디스플레이 영역과 동일한 크기입니다. 활성화되면 현재 화면이 저장되고 대체 화면으로 바뀝니다. 일반 화면이 복원 될 때까지 창 상단에서 스크롤 된 행 저장을 사용할 수 없습니다. xterm에 대한 용어 cap (5) 항목을 사용하면 비주얼 편집기 vi (1)가 편집을 위해 대체 화면으로 전환하고 종료시 화면을 복원 할 수 있습니다. 팝업 메뉴 항목을 사용하면 잘라 내기 및 붙여 넣기를 위해 일반 화면과 대체 화면을 간단하게 전환 할 수 있습니다.

http://rosettacode.org/wiki/Terminal_control/Preserve_screen 에는 tput 또는 일부 이스케이프 시퀀스를 통해 직접 수행하는 방법의 예가 나와 있습니다 .


15

echo문자열에 개행을 자동으로 추가하는 을 사용 하는 대신 printf "%s\r" whatever-캐리지 리턴은 커서를 현재 행의 시작 부분으로 보냅니다. 예:

seq 1 15 | while read num; do printf "%2d\r" $num; sleep 1; done; echo ""

터미널의 커서에 따라 더 즐거울 수 있습니다.printf "\r%2d " $num
glenn jackman
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.