터미널은 ESC [ ... m 형식의 SGR(Select Graphic Rendition) 제어 문자로 색과 글자 모양을 바꾼다. 셸 스크립트에서는 \e (또는 \033, \x1b)로 ESC 를 적는다. 색을 켠 뒤에는 반드시 \e[0m 으로 되돌린다. Shell prompt 의 PS1 에서 쓸 때는 색 코드를 \[ \] 로 감싸야 줄 길이 계산이 틀어지지 않는다.
| 색 | 전경 | 밝은 전경 | 배경 |
|---|---|---|---|
| 검정 | 30 | 90 | 40 |
| 빨강 | 31 | 91 | 41 |
| 초록 | 32 | 92 | 42 |
| 노랑 | 33 | 93 | 43 |
| 파랑 | 34 | 94 | 44 |
| 자홍 | 35 | 95 | 45 |
| 청록 | 36 | 96 | 46 |
| 흰색 | 37 | 97 | 47 |
속성은 0 초기화, 1 굵게, 2 흐리게, 4 밑줄, 7 반전이다. 256색은 \e[38;5;<0-255>m, 트루컬러는 \e[38;2;<R>;<G>;<B>m 을 쓴다.
# Define your color variables at the top for easy use
RESET='\e[0m'
WHITE='\e[37m'
LIGHT_WHITE='\e[97m'
BLUE='\e[34m'
LIGHT_BLUE='\e[94m'
RED='\e[31m'
LIGHT_RED='\e[91m'
GREEN='\e[32m'
LIGHT_GREEN='\e[92m'
PURPLE='\e[35m'
LIGHT_PURPLE='\e[95m'
YELLOW='\e[33m'
LIGHT_YELLOW='\e[93m'
MAGENTA='\e[35m'
CYAN='\e[36m'
ANSI 표준 색에 주황은 없어 노랑(33)으로 대신한다. 256색이 되는 터미널이면 ORANGE='\e[38;5;208m' 을 쓴다.
echo 는 -e 를 줘야 이스케이프를 해석한다. printf 는 그대로 해석한다.
echo -e "${RED}실패${RESET}"
printf '%b\n' "${GREEN}성공${RESET}"
출력이 터미널이 아닐 때(파이프 · 파일)는 색 코드가 글자 그대로 남으므로 걸러 낸다.
if [ -t 1 ]; then RED='\e[31m'; RESET='\e[0m'; else RED=''; RESET=''; fi
for c in $(seq 30 37); do printf "\e[${c}m color ${c} \e[0m"; done; echo