Ansi 이스케이프 시퀀스를 사용하여 xterm의 색상을 어떻게 변경할 수 있습니까?


25

명령 행에서 xterm의 색상 (배경, 글꼴, 전경)을 변경하고 싶습니다. ANSI 이스케이프 시퀀스를 사용 하여이 작업을 수행 할 수 있다고 들었습니다.

이것이 가능하다면 :

  • 어떻게 되나요?
  • 색상 이름을 사용할 수 있습니까 아니면 RGB 코드를 사용해야합니까?

답변:


27

ANSI 이스케이프 시퀀스는 이스케이프 문자 (문자 27)로 시작하는 일련의 문자로 구성됩니다. 다음 문자는 항상 열린 대괄호입니다.

echo 명령은 이스케이프에 지정 -e하고 사용 하면 이스케이프 문자를 보낼 수 있습니다 \e.

ANSI 표준은 총 16 개의 가능성을 제공하는 8 가지 색상과 밝은 모드를 정의합니다. 순서는 다음과 같습니다.

\e[<number>m

다음 <number>중 하나입니다 :

전경:

  • 30 블랙
  • 31 레드
  • 32 그린
  • 33 옐로우
  • 34 블루
  • 35 마젠타
  • 36 청록
  • 37 화이트

배경:

  • 40 블랙
  • 41 레드
  • 42 그린
  • 43 옐로우
  • 44 블루
  • 45 마젠타
  • 청록색 46
  • 47 화이트

  • 0 모두 재설정

  • 1 굵게

따라서 전경을 빨간색으로 만들고 배경을 노란색으로 만들려면

$ echo -e "\e[31m\e[43m"

그리고 굵게 표시하려면 :

$ echo -e "\e[1m"

물론, 그것들을 모두 함께 결합 할 수 있습니다 :

$ echo -e "\e[31m\e[43m\e[1m"

다른 일을하기위한 많은 다른 탈출 코드가 있습니다.

예를 들어-화면을 지우고 커서를 왼쪽 상단으로 이동하십시오.

$ echo -e "\e[2J\e[1;1H"

색상을 변경할 때 유용합니다.

$ echo -e "\e[31m\e[43m\e[1m\e[2J\e[1;1H"

색상을 변경하고 화면을 지우고 커서를 왼쪽 상단에 놓습니다. 거의 왼쪽 위입니다. Echo는 캐리지 리턴을 삽입하여 줄 아래로 이동합니다. -n까다로운 경우이를 방지하기 위해 에코에 추가 할 수 있습니다 .

모두 엉망이고 입력하는 것을 볼 수 없으면 다음을 눌러 터미널 색상을 정상으로 재설정 할 수 있습니다.

Ctrl+v [ 0 m Return

원하는 것은 명령 프롬프트입니다. 알 수없는 명령에 대해 울리지 만 다시하고있는 일을 볼 수 있습니다.


색상 코드 대신 색상 이름을 사용할 수 있습니까?
Nathan Fellman

1
아니요, 그러나 색상 코드를 변수에 할당 할 수 있습니다. FGRED = 31; echo -e "\ e [$ {FGRED} m"
Majenko

3
그러나 여러 색상 코드 번호는 ";"으로 구분할 수 있습니다. 따라서 전경을 빨간색으로 만들고 배경을 노란색으로 만들려면 echo -ne '\e[31;43m'위의 대신 더 짧은 것을 사용할 수도 있습니다 echo -e "\e[31m\e[43m".
Andreas Spindler

커서의 색상을 34 Blue로 변경하려면 어떻게합니까?
trusktr

28

최신 Xterm은 32 비트 색상을 지원합니다!

간단한 예입니다. 가치 # 53186f의 멋진 진한 자주색 배경 (각각 자신의 고유)을 설정하려면 다음을 수행하십시오.

echo -ne "\033]11;#53186f\007"

이렇게하면 후속 텍스트뿐만 아니라 전체 창의 색상이 즉시 변경됩니다. 서버에 ssh 한 후 창을 분명히 다르게 만드는 데 특히 유용합니다 (예 :). 위의 'echo'를 .bashrc에 넣으면 서버에 로그인 할 때 터미널이 자동으로 색상을 변경합니다 (그러나 Ctrl-D를 꺼도 다시 변경되지는 않습니다)

대부분의 문서는 원본 16 ANSI 색상에 대해서만 이야기합니다.

출처 : http://www.steike.com/code/xterm-colors/http://rtfm.etla.org/xterm/ctlseq.html ( "운영 체제 제어"참조)

참고 : 위의 이스케이프 시퀀스는 XTerm에 유효하며 XTerm처럼 "보일 수있는" "XTerm-like"윈도우 터미널 에뮬레이터의 다른 구현에서는 작동하지 않을 수 있습니다. 예를 들어, "gnome-terminal"또는 "konsole"은 이스케이프 시퀀스가 ​​다르거 나 색상 변경을 전혀 구현하지 않을 수 있습니다.


1
이것은 나를 위해 작동하지 않으며 터미널에서 눈에 띄는 변화가없는 빈 줄을 에코합니다.
Richard

1
매우 도움이 들으 - 다른 사람이하지 않았다 반면 이것은 나를 위해 일한
vol7ron

1
+1은 창 배경을 변경하고 "# 00ff00"대신 "green"과 같은 색상 이름을 허용합니다.
Rob I

1
# 53186f 32 비트 색상은 어떻습니까. 나는 24 비트를 계산 ...
jiggunjer

누구든지 gnome-terminal로 동일한 것을 수행하는 방법을 알고 있습니까?
wjandrea

3

예. ANSI 터미널은 ANSI 이스케이프 코드를 지원 합니다 . 각 Control Sequence Introducer( CSI) 코드는 다음 형식으로되어 있습니다 :

ESC[<<<CODE>>>

Ascii 문자 27( ESC문자) 또는 1b16 진수로 표시되고 왼쪽 대괄호가 사용 된 다음 사용할 동작을 나타내는 문자입니다.

;분리 된 매개 변수 목록은 매개 변수 바로 앞에 제공 될 수 있습니다 <<<CODE>>>.

이제 색상은 CSI코드 의 하위 세트 인 코드를 사용합니다 Select Graphic Rendition. 이들은 다음과 같은 형태입니다.

ESC[<<<SGR>>>m

SGR코드는 매개 변수로 전달됩니다 CSI. 질문과 관련하여 SGR코드 30-49가 있습니다. 코드 30-39는 전경색을 설정합니다. 코드 40-49는 배경색을 설정합니다.

30 - Foreground Black
31 - Foreground Red
32 - Foreground Green
33 - Foreground Yellow
34 - Foreground Blue
35 - Foreground Magenta
36 - Foreground Cyan
37 - Foreground White

40 - Background Black
41 - Background Red
42 - Background Green
43 - Background Yellow
44 - Background Blue
45 - Background Magenta
46 - Background Cyan
47 - Background White

코드 38과 48은 특수 코드입니다. RGB 값을 사용할 수있는 것입니다. 이러한 형식은 다음과 같습니다.

ESC[38;2;<r>;<g>;<b>m (Foreground)
ESC[48;2;<r>;<g>;<b>m (Background)

참고 : 대체 용도는 다음과 같습니다 \x1b[<3 or 4>8;5;<web safe color index>m. 이 사용법을 사용하면 완전히 다른 색상 인코딩이 있습니다. 자세한 내용은이 답변 상단의 링크를 참조하십시오.

코드 39 및 49는 전경색과 배경색을 기본값으로 설정하며 터미널별로 정의됩니다.

실제로 색상 30-37 40-47은 레이블의 색상과 약간 다릅니다.

0 - Black
1 - Darker Red
2 - Darker Green
3 - Dark/Yellow or Brown (varies between terminals)
4 - Dark Blue
5 - Dark Magenta
6 - Dark Cyan
7 - Light Grey

밝은 색상을 얻으려면 SGI를 굵게 표시 1합니다. 굵은 체는 잘못된 이름입니다. 글꼴을 굵게 표시하지 않습니다. 실제로 텍스트의 밝기가 증가합니다. 굵게 적용하면 색상이 다음과 같이됩니다.

0 - Dark Grey
1 - Bright Red
2 - Bright Green
3 - Bright Yellow
4 - Bright Blue
5 - Bright Magenta
6 - Bright Cyan
7 - White

주의 : 색상 번호의 마지막 두 블록은 앞뒤 배경 ( <index> + (30 or 40)) 과 관련이 있습니다 .

모든 스타일을 제거하려면 (기본 / 정상 모드로 돌아 가기) SGR0을 사용하십시오 .

CSI코드가 모두 그래픽 인 것은 아닙니다. 예를 들어, ESC[2J터미널이 지워집니다. ESC[<y>;<x>H커서 위치를 설정합니다 (1 색인). 자세한 내용은 Wikipedia 기사를 참조하십시오.

참고 :이를 테스트하려면 echo -e또는을 사용하십시오 printf.


2

참고 : "^ ["는 이스케이프 문자이며 CTRL-V, CTRL- [로 삽입되며 ^ G는 벨 문자이며 CTRL-V, CTRL-G로 삽입

다음 블록은 내 .bash_profile에 있으며 내 시스템을 변경 한 다른 시스템에 로그온 한 후에도이 시스템의 xterm이 항상 흰색이되도록합니다.

perl -e '$e=chr(27);print "${e}[37m ${e}[40m ${e}[2J ${e}[1;1H";'
export PS1='^[[37m^[]0;${HOST}: ${PWD}^G^[[40m${USER}@${HOST}:${PWD}
--> '

0

또한 프로젝트 확인 ScriptEchoColor
완전히 bash는 스크립트에서 만든
이 우분투 패키지가 여기에
있지만 (최신이 또한 자식에서 다운로드 할 수 있습니다)하는 방법을 알고있는 경우이 스크립트는 어떤 배포판에 설치할 수 있습니다.

단축 또는 확장 색상 이름을 다음과 같이 사용할 수 있습니다.

echoc "@rRedFg@{/blue}BlueFg@{/GREEN}GreenBg"

샘플: 여기에 이미지 설명을 입력하십시오

또한 문자뿐만 아니라 xterm 자체에 대한보다 광범위한 제어를 위해 xtermcontrol을 살펴보십시오 .


0

많은 ANSI CSI 코드 중에는 SGR 또는 Select Graphic Rendition이라는 코드 가 있습니다. 이것은 ESC,, [parameters이며 m, 여기서 매개 변수는 세미콜론으로 구분 된 ASCII 형식의 하나 이상의 정수입니다. 여러 위키 백과 페이지에 여러 가지 SGR 매개 변수가 나열되어 있습니다 (모든 매개 변수에 대해 자세히 설명하지는 않음).

같은 일부 매개 변수, 1(굵게 또는 증가 된 강도) 및 31(빨간색 텍스트)은 독립형이며, 개별적으로 사용하거나 결합, 같이 할 수 있습니다 ESC[31m또는 ESC[1;31m각각 표준 빨간색과 굵은 빨간색 전경 텍스트를 제공 할 수 있습니다.

다른 사람들은 매개 변수 자체를 취하는데, 이는 코드 뒤에 더 세미콜론으로 구분 된 숫자로 제공됩니다. 예를 들어, ESC[38;5;219m확장 색상 번호 219로 전경 텍스트를 ESC[38;2;150;100;50m표시하고 RGB 값 150, 100, 50으로 색상으로 표시합니다.이 경우 38"확장 된 전경 색상 설정"명령은 항상 다음에 의해 수행됩니다. 부속 명령. 부속 명령 2은 빨강, 녹색 및 파랑 구성 요소의 값인 세 가지 매개 변수를 사용합니다. 이와 달리 부속 명령 5은 터미널이 구성된 테이블에서 색상을 지정하는 0에서 255 사이의 숫자를 하나 더 가져옵니다.

다음 코드 기능은이 코드를 사용하는 데 유용 할 수 있습니다.

sgr() {
    local codes=${1:-0}; shift
    for c in "$@"; do codes="$codes;$c"; done
    echo -n -e "\e[${codes}m"
}

다음과 같이 사용할 수 있습니다.

normal=$(sgr 0)
red=$(sgr 31)
echo "Text can be $(sgr 1)made boldface$(sgr 0)" \
     " or ${red}colored red${normal}" \
     " or $(sgr 31 1)even both at the same time$(sgr)."

매개 변수를 sgr()지정 하지 않으면 기본값은 SGR 코드 0으로 설정됩니다. 즉, 모든 속성을 끄고 텍스트를 해당 터미널의 기본값으로 재설정합니다.


1
기술적으로 그 ESC[38... mESC[38... m캔 /해야 (정보의 소스에 따라 달라집니다 - 궁극적 인 하나의 존재가, 내가 생각 itu.int/rec/T-REC-T.416-199303-I가 )를 사용해야합니다, 그렇지 않으면, 문자 예약 :(별도하는 매개 변수 요소를 가 있음) 그래서 ;에만 완료 사이에 사용되는 매개 변수 문자열 - 예를 ESC[38;2;150;100;50m작성해야 ESC[38:2::150:100:50m...
SlySven

... 불행하게도 구현은 종종 잊어 색 공간 ID 사이 2150, 노 하나를 - 내가 알고임을 빈 기본 사용할 수 있습니다에 가야한다 어떤 값을 적 정의했다 -하지만 종종 오프 놓친 ;분리기로서 만 사용하는 것은 명세서에 따라 정보를 신뢰성있게 처리하는 것을 불가능하게한다.
SlySven
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.