화면 버퍼 및 대화 상자

화면 버퍼 및 대화 상자

내 스크립트에 다른 화면 버퍼를 사용하기 위해 tput을 사용하려고 합니다. 아래는 제가 실행 중인 작은 스크립트입니다.

tput smcup
clear
dialog --yesno "Do you want to continue?" 0 0
rc=$?
clear
tput rmcup
if [ "${rc}" == "0" ]; then
  echo Yes
else
  echo No
fi

스크립트 실행이 완료되면 스크립트를 실행하기 전 프롬프트가 차지한 줄 수와 동일한 화면의 빈 부분(아래 이미지 참조)이 나타납니다. 이상적으로 tput는 두 번째 화면 버퍼로 전환해야 하며 실행 후에는 첫 번째 화면 버퍼로 반환되어야 합니다. 스크립트는 두 번째 화면으로 전환되지만 있어서는 안 되는 공백을 남기고 반환됩니다.

여기에 이미지 설명을 입력하세요.

답변1

dialog실천의 문제다http://invisible-island.net/dialog/dialog.html.

smcup시작 시 자체적으로 + 연산을 수행하는데 , 초기화 루틴이 연산을 수행하고 이를 취소하려고 하기 때문이라고 생각합니다. 그래서 미리 하시면 취소가 되기 때문에 아무런 효과가 없습니다.rmcupncursessmcupdialogsmcuprmcup

해결 방법은 이 작업을 수행하지 않도록 지시하는 옵션을 추가하여 --keep-tite터미널이 지원하는 경우 dialog다른 응용 프로그램처럼 smcup시작하고 rmcup종료하는 것입니다.ncurses

귀하의 의견에 따르면 또 다른 문제에 직면한 것 같습니다. 귀하가 사용 중인 터미널은 대체 화면을 지원하지 않으므로 무엇을 하든 해당 대체 화면을 사용할 수 없습니다. 존재하지 않습니다.

그러나 할 수 있는 일은 Cygwin X Server의 Putty 또는 Cygwin Unix 터미널과 같은 대체 화면이 있는 다른 터미널을 사용하는 것입니다. 또는 원격 서버에서 X 터미널을 실행하여 X 서버에 연결하고 표시합니다. 또는 터미널 내에서 GNU와 같은 대체 화면을 지원하는 터미널 기반 터미널 에뮬레이터를 실행하세요 screen.

답변2

문제는 제안된 것보다 더 복잡합니다. 스크립트로 시작하십시오.

tput smcup
clear
dialog --yesno "Do you want to continue?" 0 0
rc=$?
clear
tput rmcup
if [ "${rc}" == "0" ]; then
  echo Yes
else
  echo No
fi

대체 화면은 하나만 있습니다(그리고 이를 스택으로 생각할 수 없습니다). (기술적으로는 "커서 주소 지정 모드 시작 tput smcup") 대체 화면으로 전환하기 위해 xterm 및 유사한 프로그램과 함께 자주 사용됩니다. 실제로 이 목적을 위해 xterm에는 여러 제어 시퀀스가 ​​구현되어 있습니다(참조:vi를 실행할 때 화면이 지워지지 않는 이유는 무엇입니까?), 일부는 유사 항목으로 인식되지 않습니다. 댓글 중 하나에서는 이 경우의 실제 터미널은 MobaXterm이라고 했습니다. 이는 MobaXterm의 terminfo에서 1049 코드를 처리하는 PuTTY를 기반으로 합니다(코드 사용).

그래서...

  • 대체 화면으로 전환하는 스크립트
  • 지워졌습니다(다시 말하지만 xterm이 이전 단계의 대체 화면을 지웠습니다).
  • 대화 상자를 실행하고,아직대체 화면을 사용하세요.
  • 대화 상자가 종료되면 시퀀스를 보내고 rmcup일반 화면으로 다시 전환하며 내용은 스크립트가 시작되기 전과 동일합니다.
  • 그러면 화면이 지워집니다. 일반적으로 이로 인해 커서가 화면의 왼쪽 상단으로 이동한 다음 지워집니다(아래 참조).
  • 마지막으로 tput rmcup사용됩니다. 이를 위해서는 터미널 에뮬레이터가 대체 화면에서 다시 전환해야 합니다.

터미널은 이미 일반 모드에 있으므로 마지막 줄은 (적어도) 두 가지 방법 중 하나로 해석될 수 있습니다.

  • 그것은 무시될 수 있다
  • 대기 모드에서 일반 모드로 전환할 때 수행되는 일부 작업이 수행될 수 있습니다.

이 경우는 후자인 것 같습니다.부분구현하다. PuTTY(및 xterm의 빠른 확인)첫 번째tput smcup프롬프트가 화면 중앙에 있기 때문에 사용됩니다 (상단에 clear남아 있지 않고). OP는 스크립트를 실행하기 전에 창에서 여러 명령이 실행되었기 때문에 공백을 발견했습니다. 커서가 원래 위치로 돌아 clear왔지만 tput rmcup.

관련 정보