터미널은 원래 전신타자기라고 불리는 일종의 프린터였고 아주 기본적인 제어 동작만을 가지고 있었는데 커서의 위치를 이동시키는 것은 개행이나 캐리지 리턴 정도만 가능했고 한번 인쇄된 문자를 바꾸는 것은 불가능했다. 이후 디스플레이에 출력되는 전자 제어식 터미널이 보급되면서 더 다양한 동작이 가능해졌는데 출력된 문자를 지우는 것도 가능하고 커서를 임의의 위치로 이동시키는 동작이 가능해졌다.
초기에는 표준이 정해지지 않아 터미널을 설계하는 회사마다 동작이 달랐는데 각 회사의 제품마다 지원되는 기능이 다르고 비슷하거나 같은 기능이여도 사용법이 다르는 등 호환성에 악영향을 끼쳤다. 그래서 터미널의 동작을 통일시켜야 할 필요성이 생겼고 터미널이 가져야 할 기본적인 동작들을 모아 미국 국가표준 협회(ANSI)에서 표준을 정해 ANSI 이스케이프 시퀀스 표준(ANSI escape sequences standard)이 탄생한다.
ANSI 이스케이프 시퀀스(ANSI escape sequences)는 비디오 텍스트 터미널 및 터미널 에뮬레이터에서 커서 위치, 색, 글꼴 스타일, 그 밖의 옵션을 제어하는 대역 내 신호 방식을 위한 표준이다. 대부분 ASCII 이스케이프 문자와 괄호 문자로 시작하는 특정 바이트 시퀀스들은 텍스트에 임베디드된다. 터미널은 이 시퀀스들을 텍스트가 아닌 명령으로 해석한다.
여기에서는 글꼴 스타일, 색, 배경 색을 제어하는 ANSI color code만 살펴볼 것이다.
color code | 기능 |
---|---|
[0m | 모든 색과 스타일 초기화 |
[1m | 굵게(bold) / 밝게 |
[3m | 이탤릭체(italic) |
[4m | 밑줄(underline) |
[7m | 반전(글자색/배경색을 거꾸로) |
[9m | 가로줄 치기 |
[22m | 굵게(bold) 제거 |
[23m | 이탤릭체(italic)제거 |
[24m | 밑줄(underline)제거 |
[27m | 반전 제거 |
[29m | 가로줄 제거 |
[30m | 글자색: 검정 |
[31m | 글자색: 빨강 |
[32m | 글자색: 초록 |
[33m | 글자색: 노랑 |
[34m | 글자색: 파랑 |
[35m | 글자색: 마젠트(분홍) |
[36m | 글자색: 시안(청록) |
[37m | 글자색: 백색 |
[39m | 글자색으로 기본값으로 |
[40m | 바탕색: 흑색 |
[41m | 바탕색: 적색 |
[42m | 바탕색: 녹색 |
[43m | 바탕색: 황색 |
[44m | 바탕색: 청색 |
[45m | 바탕색: 분홍색 |
[46m | 바탕색: 청록색 |
[47m | 바탕색: 흰색 |
[49m | 바탕색을 기본값으로 |
거의 모든 동작은 16진수 값으로 0x1B, 8진수 값으로 \033을 가지는 ESC(escape) 문자로 시작한다.
일반적으로 키보드로는 입력할 수 있는 방법이 없기 때문에 이 문자를 입력하는 방법은 환경에 따라 약간 다르다. 셸이 이스케이핑을 지원하는 경우 \033으로 입력할 수 있고 bash의 경우 기본적으로 Ctrl+V키를 사용하면 제어 문자를 입력 가능하기 때문에 그 상태에서 ESC 키를 누르면 입력 가능하다.
ESC 문자 뒤로 오는 몇가지 문자가 동작을 결정하는데 거의 대부분의 기능은 [를 사용하는 CSI(control sequence introducer)로 시작한다. 이 문자가 제공하는 기능은 커서 조작, 색상, 터미널 제어등의 여러가지 기능들을 가지고 있다.
$> echo “ [0m : 모든 색과 스타일 초기화“
$> echo “\033[01m [01m : 굵게(bold) / 밝게 \033[0m“
$> echo “\033[3m [3m : 이탤릭체(italic) \033[0m“
$> echo “\033[4m [4m : 밑줄(underline) \033[0m“
$> echo “\033[7m [7m : 반전(글자색/배경색을 거꾸로) \033[0m“
$> echo “\033[9m [9m : 가로줄 치기 \033[0m“
$> echo “\033[22m [22m : 굵게(bold) 제거 \033[0m“
$> echo “\033[23m [23m : 이탤릭체(italic)제거 \033[0m“
$> echo “\033[24m [24m : 밑줄(underline)제거 \033[0m“
$> echo “\033[27m [27m : 반전 제거 \033[0m“
$> echo “\033[29m [29m : 가로줄 제거 \033[0m“
$> echo “\033[30m\033[47m [30m : 글자색:검정 \033[0m“
$> echo “\033[31m [31m : 글자색:빨강 \033[0m“
$> echo “\033[32m [32m : 글자색:초록 \033[0m“
$> echo “\033[33m [33m : 글자색:노랑 \033[0m“
$> echo “\033[34m [34m : 글자색:파랑 \033[0m“
$> echo “\033[35m [35m : 글자색:마젠트(분홍) \033[0m“
$> echo “\033[36m [36m : 글자색:시안(청록) \033[0m“
$> echo “\033[37m [37m : 글자색:백색 \033[0m“
$> echo “\033[39m [39m : 글자색으로 기본값으로 \033[0m“
$> echo “\033[40m [40m : 바탕색:흑색 \033[0m“
$> echo “\033[41m [41m : 바탕색:적색 \033[0m“
$> echo “\033[42m [42m : 바탕색:녹색 \033[0m“
$> echo “\033[43m [43m : 바탕색:황색 \033[0m“
$> echo “\033[44m [44m : 바탕색:청색 \033[0m“
$> echo “\033[45m [45m : 바탕색:분홍색 \033[0m“
$> echo “\033[46m [46m : 바탕색:청록색 \033[0m“
$> echo “\033[47m [47m : 바탕색:흰색 \033[0m“
$> echo “\033[49m [49m : 바탕색을 기본값으로 \033[0m“
실행 결과
참고자료
https://ko.wikipedia.org/wiki/ANSI_%EC%9D%B4%EC%8A%A4%EC%BC%80%EC%9D%B4%ED%94%84_%EC%BD%94%EB%93%9C
https://xinet.kr/?p=220
https://thdnice.tistory.com/105