[unix] 터미널 색상 이스케이프 시퀀스는 bash의 어디에나 정의되어 있습니까?

Bash 스크립팅 (주로 CentOS에서)에서 너무 자주 색상을 사용했지만 사용법을보다 편리하게하기 위해 변수를 색상 값으로 재정의 합니다.

local GRAY="\[\033[1;30m\]"
local LIGHT_GRAY="\[\033[0;37m\]"
local CYAN="\[\033[0;36m\]"
local LIGHT_CYAN="\[\033[1;36m\]"
local NO_COLOUR="\[\033[0m\]"

또는 함께 tput:

bold=`tput bold`
normal=`tput sgr0`
whitef=`tput setaf 7`
greenf=`tput setaf 2`
redb=`tput setab 1`

/etc/rc.d/init.d디렉토리를 둘러 보았지만 거기에서 색상 정의와 관련된 것을 찾지 못했습니다.

그러한 정의가 이미 존재합니까? 그렇지 않으면 예를 들어 파일에 파일을 넣고 /etc/rc.d/init.d스크립트에 포함 시키십시오./etc/rc.d/init.d/functions



답변

당신이 요구하는 것에 몇 가지 측면이 있습니다.

먼저 bash는 색상을 정의하지 않습니다. 실제로 bash는 색상이 존재한다는 것을 전혀 모릅니다. 아는 것은 문자를 출력하도록 지시했다는 것 \033[0;36m입니다. 터미널 에뮬레이터 (xterm, gnome-terminal 등)는 이러한 문자를 수신하고 “청록색으로 출력을 시작해야합니다”를 이해합니다.

따라서 색상을 이해하는 것은 터미널 에뮬레이터입니다. 터미널 에뮬레이터 \033[0;36m는 시안 이라는 것을 이해 하지만 다른 터미널 에뮬레이터는 시안에 대해 완전히 다른 문자 집합을 사용할 수 있습니다. 이것이 이유입니다 tput. 당신이 실행하면 tput setaf 6, tput컬러 6 (시안)에 대한 터미널의 이스케이프 코드를 찾아 볼 것, 출력 이스케이프 코드가된다.
( 코드 에 대한 자세한 내용은 이 질문 을 참조하십시오 tput setaf)

이제 배쉬로 돌아갑니다. 아시다시피, 시안 색을 언급 할 때을 사용 \033[0;36m하지 않았습니다 \[\033[0;36m\]. 대괄호가 없습니다. 대괄호의 목적은 프롬프트에서 이스케이프 코드 (색상)를 사용할 때 bash가 인쇄하지 않는 문자를 인식해야한다는 것입니다 (너비 0, 실제로는 표시하지 않음). 따라서 비 인쇄 문자를로 묶습니다 \[ \]. 이러한 문자를 제거하면 처음에는 모든 것이 제대로 작동하는 것처럼 보이지만 명령이 터미널 너비를 초과하면 모든 종류의 기묘함이 발생하기 시작합니다. 입력 할 때 bash는 명령이 다음 줄로 줄 바꿈되어야하는시기를 알아야하기 때문입니다. 이를 위해 프롬프트 너비와 입력 한 너비를 계산합니다.

에 대한 또 다른 메모 tput. CYAN="\[\033[0;36m\]"하지 와 같은 것 CYAN="$(tput setaf 6)". 방금 논의했듯이 대괄호는 bash와 관련이 tput있으며 터미널 이스케이프 코드 만 출력합니다.

대괄호는 일반적으로 프롬프트에서만 관련이 있기 때문에 스크립트 나 다른 결과물에 색상을 사용하는 경우에는 사용하지 않아야합니다. 즉, 프롬프트 이상의 색상을 사용하려면 여러 변수를 정의해야합니다. 하나는 프롬프트에서 사용하기위한 대괄호가 있고 다른 하나는없는 것입니다. 프롬프트에서 색상을 참조 할 때마다 대괄호를 수동으로 추가 할 수는 있지만

간단히 말해, 다음과 같은 것을 정의하고 싶을 것입니다.

local CYAN="$(tput setaf 6)" # OR CYAN="\033[0;36m"
local LIGHT_CYAN="$CYAN$(tput bold)" # OR LIGHT_CYAN="\033[1;36m"
local PROMPT_CYAN="\[$CYAN\]"
local PROMPT_LIGHT_CYAN="\[$LIGHT_CYAN\]"


답변