간단한 방법을 통해 커서 위치를 저장하고 복원할 수 있어야 합니다.ANSI 이스케이프 시퀀스
ANSI 이스케이프 시퀀스를 사용하면 화면에서 커서를 자유롭게 이동할 수 있습니다. 이는 쉘 스크립트로 생성된 전체 화면 사용자 인터페이스에 더 유용하지만 프롬프트에서도 사용할 수 있습니다. 모션 이스케이프 시퀀스는 다음과 같습니다.
- [...]
- 커서 위치 저장:
\033[s
- 커서 위치 복원:
\033[u
그러나 이 ANSI 시퀀스는 커서의 수평 위치만 복원하는 것으로 보입니다. 예를 들어:
$ printf 'Doing some task...\e[s\n\nMore text\n\e[udone!\n\n\n'
Doing some task...
More text
done!
$
수평은 done!
올바른 위치에 있지만 수직은 올바르지 않습니다(복구 측면에서 정확함).
- 내가 뭐 놓친 거 없니? 이것을 재현할 수 있나요? !
- 이것이 예상되는 동작입니까? 그렇다면
done!
나중에 어떻게 인쇄 합니까task...
? - 이런 일이 발생하지 않으면 내 환경의 무언가에 의해 이 동작이 간접적으로 발생할 수 있습니까?
많은 질문을 검색하고 읽었지만 제가 경험한 이러한 행동에 대한 정보를 찾지 못했습니다. 실제로 tput
via에서도 같은 일이 발생합니다.
$ printf 'Doing some task...'; tput sc; printf '\n\nMore text\n'; tput rc; printf 'done!\n\n\n'
답변1
내가 뭐 놓친 거 없니? 이것을 재현할 수 있나요? !
내가 터미널 맨 아래에 있고 콘텐츠의 다음 줄이 위로 이동하면 할 수 있습니다. 그러나 터미널에서 테스트를 반복하십시오.스크롤 없음동시에. Ctrl+ L(또는 전화 )를 클릭 clear
하고 맨 위에서 시작합니다. 그러면 원하는 대로 작동할 것입니다.
이것이 예상되는 동작입니까?
그렇게 생각해요. 커서 위치는 화면 내용이 아니라 화면을 기준으로 합니다.
done!
나중에 어떻게 인쇄하나요task...
?
가능한 접근 방식: 6줄 이하로 인쇄하고 터미널이 충분히 큰 경우 먼저 6줄의 빈 줄을 인쇄하여 먼저 스크롤한 다음 의미 있는 텍스트를 인쇄하기 전에 커서를 위로 이동합니다.
printf '\n\n\n\n\n\n'; printf '\033[6A'; printf 'Doing some task...\e[s\n\nMore text\n\e[udone!\n\n\n'
논리를 보여주기 위해 세 개의 개별 s를 사용했지만 printf
하나일 수도 있습니다.
답변2
나를 위해 작동합니다. 나는 사용하는 것을 선호한다용어 정보 데이터베이스( man 5 terminfo
)는 하드 코딩된 이스케이프 시퀀스 대신 사용됩니다.
sc=$(tput sc) rc=$(tput rc) el=$(tput el)
clear; printf 'Doing some task...%s\n' "$sc"; sleep 1; printf '%sDONE%s\n' "$rc" "$el"
현재 커서 위치를 저장/복원하는 것보다 더 나은 옵션인 경우 커서를 절대 위치(왼쪽 위 모서리의 {0,0})로 이동할 수도 있습니다.
tput cup 4 40; sleep 1; printf "%s\n" 'This is row 4 column 40'