문자열을 인쇄하기 위해 터미널에서 커서를 위로 스크롤하는 방법은 무엇입니까?

문자열을 인쇄하기 위해 터미널에서 커서를 위로 스크롤하는 방법은 무엇입니까?

aircrack-ng여기서는 터미널 화면에 텍스트를 표시하거나 매트릭스 스크립트와 같은 것을 원합니다 ...!

예를 들어, 내 터미널 화면에 이미 4줄이 포함되어 있는 경우 첫 번째 줄을 그 자리에 업데이트하고 다른 줄도 동일하게 업데이트하려고 합니다... (bash 사용)

보다 정확하게는 다음과 같은 스크립트를 원합니다.

#!/bin/bash
while :
  do
    echo "line1"
    echo "line2"
    echo "line3"
    echo "line4"
    # without using clear cmd, next cycle line1 should be printed
    # in line1 place not in a new line , and same for other lines
  done

답변1

이를 지원하는 터미널에서는 다음을 사용하여 tput sc커서 위치를 저장하고 tput rc복원할 수 있습니다.

i=0
tput sc
while sleep 1; do
  tput rc
  echo "line$((i=i+1))"
  echo "line$((i=i+1))"
  echo "line$((i=i+1))"
  echo "line$((i=i+1))"
done

산출

tput각 호출을 피하기 위해 이러한 이스케이프 시퀀스를 변수에 저장할 수 있습니다 .

rc=$(tput rc) ||
  echo >&2 "Warning: terminal doesn't support restoring the cursor"
...
printf '%s\n' "${rc}line1..."

이를 지원하지 않는 드문 터미널에서는 항상 커서 위치 지정 순서를 사용할 수 있습니다.

while sleep 1; do
  echo "line$((i=i+1))"
  echo "line$((i=i+1))"
  echo "line$((i=i+1))"
  echo "line$((i=i+1))"
  tput cuu 4 # or up=$(tput cuu1); printf %s "$up$up$up$up"
done

자세한 내용은 terminfo섹션 5의 매뉴얼 페이지를 참조하십시오(시스템에 ncurses가 제공되는 경우).

답변2

나는 몇 달 전에 StackOverflow에서 이 질문에 답변했습니다.마지막 터미널 출력 덮어쓰기(여러 줄). 나는 그렇게 생각하지만가능한문자 그대로 "line1", "line2" 등을 인쇄하여 OP가 의미하는 바는 교실 실습에서만 관심이 있을 것입니다. 실제 프로그램은 더 흥미로운 내용을 인쇄하므로 나는 대답합니다.저것질문. 이전과 마찬가지로 현재 q/a는 업데이트된 행이 기존 행보다 짧을 때 이 문제를 무시합니다. 이 문제를 해결하다

#!/bin/bash
tput sc
while :
  do
    tput rc
    echo "line1"; tput el
    echo "line2"; tput el
    echo "line3"; tput el
    echo "line4"; tput el
    # without using clear cmd, next cycle line1 should be printed
    # in line1 place not in a new line , and same for other lines
  done

이것이 cuu좋은 대안이라는 데 동의하십시오 grep. 기능의 가용성을 확인하는 데 사용하는 것은 tput그 자체를 사용하는 것보다 덜 효과적입니다.

restore=$(tput sc)
[[ -z "$restore" ]] && restore=$(tput cuu 4)
[[ -z "$restore" ]] && restore=$(tput cuu1; tput cuu1; tput cuu1; tput cuu1)

표현식에 행 번호를 삽입하는 방법은 여전히 ​​다소 조잡합니다. 하지만 $restore루프가 끝나면 그렇게 할 수 있습니다.

el터미널을 체크인하면 비슷한 작업을 수행할 수 있습니다.

이것이 bash인 경우 echo "line1"등은 실제로 함수여야 합니다(중복 호출을 제거함 tput el).

OP가 접할 수 있는 터미널은 이러한 기능을 모두 지원할 수 있습니다. 커서 제어 저장/복원은 두 가지 주요 변형이 있으므로 약점입니다.

  • DECSC/ DECRC(xterm에서 지원 - 참조XTerm 제어 순서):

    ESC 7     Save Cursor (DECSC).
    ESC 8     Restore Cursor (DECRC).
    
  • ANSI.SYS(xterm에서도 지원되지만 모든 "xterm 에뮬레이터"는 지원되지 않음):

    CSI s     Save cursor (ANSI.SYS), available only when DECLRMM is disabled.
    CSI u     Restore cursor (ANSI.SYS).
    

기타 유용한 정보 출처:

그런데, 이 질문의 제목은 (지금까지 답변이 없는) 주어진 예에서 다음을 사용하기 때문에 잘못되었습니다.스크롤. 스크롤 영역을 사용하려면 (terminfo를 다시 참조하고 xterm과 같은 VT100과 유사한 터미널로 제한) 할 수 있습니다. 시작할 곳은 여기입니다(terminfo 매뉴얼 페이지에서):

   change_scroll_region          csr        cs        change region to      
                                                      line #1 to line #2    
                                                      (P)   

관련 정보