터미널이 불필요한 이스케이프 시퀀스를 자동으로 무시합니까?
#!/bin/sh
printf "\033[?25l"
printf "\033[?25l" # superfluous
printf "\033[31m"
printf "\033[31m" # superfluous
printf "Red Text\n"
sleep 1
printf "\033[0m"
printf "\033[?25h"
답변1
예, 그렇습니다.
여는 태그와 닫는 태그가 서로 일치해야 하는 HTML과 같은 특정 문서 형식에 익숙할 수 있습니다. 예를 들어 다음은 중요하지 않습니다.
<font style="color:red"><font style="color:red">foobar</font></font>
그러나 라벨의 균형이 맞지 않기 때문에 그렇지 않습니다.
<font style="color:red"><font style="color:red">foobar</font>
터미널 에뮬레이션은아니요이와 같이. 터미널 에뮬레이터는 전체 "문서"를 한 번에 보는 것이 아니라 시간이 지남에 따라 들어오는 스트림을 봅니다.
터미널 에뮬레이터는 상태 머신입니다. 컨텍스트를 열거나 닫거나 하지 않는 등의 완전한 이스케이프 시퀀스는 단지 새로운 상태를 설정 \033[?25l
합니다 . \033[31m
첫 번째 예에서는 커서가 보이지 않게 되고, 두 번째 예에서는 빨간색 글꼴로 전환됩니다. 여러 번 실행할 수 있으며 커서가 더 이상 보이지 않고 텍스트가 더 빨간색으로 변하지 않으며 이러한 명령의 인스턴스가 스택 어딘가에 남아 있지 않습니다. 이는 일회성 할당입니다. 커서는 표시되지 않으며(이전 상태에 관계없이) 인쇄된 후속 텍스트의 색상이 빨간색으로 전환됩니다(역시: 이전 상태에 관계없음).
일종의 열기-닫기 의미를 갖는 이스케이프 시퀀스는 몇 가지뿐입니다. 예를 들어 현재 창 제목을 스택에 푸시하고 거기에서 팝할 수 있으며 당연히 쌍으로 사용해야 합니다.