예.

예.

특정 행/열에 커서를 놓고 첫 번째 좌표와 정렬된 상태로 유지되는 여러 줄 파일/명령을 인쇄하고 싶습니다.

tput clear
tput cup 5 15
ping www.google.com

열 15의 모든 후속 행이 출력됩니다. 실제로 첫 번째 줄은 올바르게 인쇄되지만 후속 줄은 왼쪽으로 재설정됩니다. 사용 tput이나 다른 방법이 가능한가요 ?

답변1

한 가지 방법은 해당 위치에 탭 정지를 설정하는 것입니다.

trap 'tabs -8' EXIT INT TERM # restore to default tab stops every 8 columns
                             # upon exit or signal

tput tbc # clear tab stops
tput cup 5 15
tput hts # set one and only tab stop
printf '\r' # move back to the beginning of the line
printf '\t%s\n' foo bar baz
ping www.google.com | paste /dev/null -

이는 터미널의 동작에 영향을 미치며 예를 들어 일시 중지되었을 때 문제를 일으킬 수 있습니다.

@Thor cup기반 접근 방식에 비해 장점은 더 적은 출력을 전송한다는 것입니다(300 보드 위성 링크를 사용하지 않는 한 실제로는 문제가 되지 않음). syslog와 같은 다른 프로세스도 터미널에 텍스트를 쓰는 경우 해당 동작이 더 우아해질 것입니다.

각 줄이 위치 15에서 시작하도록 하는 또 다른 방법은 각 줄의 접두사를 붙이는 것입니다 \r$(tput cuf 15).

tput cup 5 15
ping www.google.com | PREFIX=$(tput cr; tput cuf 15) awk '
  {print ENVIRON["PREFIX"] $0}'

csr스크롤 영역 설정 기능 도 참조하세요 .

사용된 경우 zsh해당 항목도 참조하세요.zcurses builtin

답변2

예.

...문제의 프로그램 출력을 사후 처리할 필요가 없으며, (일부 프로그램처럼) 터미널 문자 장치가 아닌 파이프와 통신한다고 생각하기 때문에 동작을 변경하게 할 필요도 없습니다.

tput필요한 기능을 제공하는 terminfo 함수가 없기 때문에 이 작업을 수행할 수 없습니다. 게다가 이 기능은특정한특정 클래스의 터미널, 즉 DEC VT 시리즈 터미널에 있는 여러 제어 시퀀스를 구현하는 터미널입니다.

하지만 그것은가능한.

터미널 수가 적네요. 터미널 에뮬레이터에서는 DEC VT 및 해당 제어 시퀀스를 에뮬레이트하는 것이 널리 사용됩니다. 그러나 모든 터미널 에뮬레이터가 이에 필요한 특정 DEC VT 제어 시퀀스를 이해하고 구현하는 것은 아닙니다. 다음이 포함됩니다:

이러한 터미널에는 구성 가능한 DEC VT 개념이 있습니다.여유. 여백은 일반 출력의 스크롤 및 자동 여백 래핑 동작을 제어합니다. 터미널에는 DEC VT 개념도 적용되어 있습니다.원산지 모드. 이것은모드 설정설정할 때존재하다, 수익을 창출하다반품CUP 및 HVP 제어 시퀀스를 사용하여 절대 커서 위치 지정을 제어합니다. 마지막으로 그들은 구현합니다.모두최신 DEC VT 모델에서 제공되는 새로운 마진을 포함한 마진.

따라서 프로그램이 시작되거나 계속될 때:

  • DECSTBM 제어 시퀀스를 실행하여 위쪽 및 아래쪽 여백을 설정합니다.
  • DECLRMM 모드를 켜서 왼쪽 및 오른쪽 여백 메커니즘을 활성화합니다.존재하다.
  • DECSLRM 제어 시퀀스를 실행하여 왼쪽 및 오른쪽 여백을 설정하십시오.
  • DECOM 모드 켜기존재하다.
  • 원점 모드를 켰을 때 여백을 벗어나는 경우를 대비하여 커서를 위치시키고, 원점 모드를 켰을 때 커서가 자동으로 이동하지 않습니다.

프로그램이 종료되거나 일시 정지되거나 종료되면 반대 작업을 수행하여 화면을 원래대로 되돌립니다. 또한 커서 주소 지정 모드를 사용하는 프로그램이 전체 화면의 크기가 아닌 여백 영역의 크기를 알 수 있도록 라인 규칙에 저장된 터미널 크기에 대한 정보를 올바르게 유지해야 합니다.

처음엔 이렇겠지

printf '\e[%d;%dr\e[?69h\e[%d;%ds\e[?6h\e[H'' 5 20 5 65
stty 행 15 열 60
핑 www.google.com
printf '\e[?6l\e[s\e[?69l\e[r'
stty 행 25 열 80
스크립트가 종료될 때 정리 동작을 대폭 개선하고 행 규칙의 행과 열을 복원하는 데는 더 현명해야 합니다.옳은(간결함을 위해 내가 했던 것처럼 잘못된 가정을 하는 대신).

더 적은 기능을 위해 이러한 터미널 에뮬레이터는 위쪽 및 아래쪽 여백을 존중하지만 여기에 특별히 필요한 왼쪽 및 오른쪽 여백 메커니즘은 없습니다.

  • UrxVT
  • 위로
  • 용어
  • 퍼티

기본 화면 버퍼와 백업 화면 버퍼에 대해 여백을 별도로 설정해야 합니다. 따라서 커서 주소 지정 모드로 전환할 때 대체 화면 버퍼로 전환하는 프로그램은 이에 영향을 받지 않습니다. 이 그룹에는 NeoVIM과 같은 프로그램과 더 적은 수의 프로그램이 포함됩니다. 커서 주소 지정 프로그램아니요그러나 대체 화면 버퍼로 전환됩니다. 후자 그룹에는 Z 셸의 ZLE와 같은 항목이 포함됩니다.

추가 읽기

답변3

짧은 대답: 아니요.

tput cup그러나 각 새 줄 앞에 하나를 내보내면 효과를 시뮬레이션할 수 있습니다. 예를 들면 다음과 같습니다.

i=5
tput clear
tput cup $i 15
ping google.com | 
while read; do 
  tput cup $((++i)) 15
  echo "$REPLY"
done

또는 단일 "명령"으로:

i=5; tput clear; tput cup $i 15; ping google.com | 
while read; do tput cup $((++i)) 15; echo "$REPLY"; done

커서 작업의 복잡성에 따라 에서 이 작업을 수행할 수도 있습니다 ncurses.배쉬 간단한 저주.

관련 정보