tput의 'setf'와 'setaf'의 차이점은 무엇입니까?

tput의 'setf'와 'setaf'의 차이점은 무엇입니까?

이 명령 tput에는 색상 설정을 위한 두 가지 옵션이 있지만 setfsetaf다 내 컴퓨터에서는 제대로 작동하는 것 같습니다.

$ tput setf 2 && echo 'Hello world!'
$ tput setaf 2 && echo 'Hello world!'

setb와 에도 비슷한 이중성이 있는 것 같습니다 setab.

두 옵션의 차이점은 무엇입니까?

답변1

setf8가지 색상으로만 제한됩니다. setaf최대 256가지 색상을 설정할 수 있습니다.

(다음 모든 정보는 내 터미널이므로 urxvt에만 해당되지만 정보는 다른 터미널과 동일하지는 않더라도 유사합니다)

둘 다 setf다른 setaf이스케이프 코드를 제공합니다. 다음에서 이를 볼 수 있습니다.

# tput setf 2 | xxd  
0000000: 1b5b 3332 6d                             .[32m

# tput setaf 2 | xxd 
0000000: 1b5b 3338 3b35 3b32 6d                   .[38;5;2m

urxvt(7)매뉴얼 페이지에서 :

   "ESC [ Pm m"
       Character Attributes (SGR)
       ...
       Pm = 30 / 40       fg/bg Black
       Pm = 31 / 41       fg/bg Red
       Pm = 32 / 42       fg/bg Green
       Pm = 33 / 43       fg/bg Yellow
       Pm = 34 / 44       fg/bg Blue
       Pm = 35 / 45       fg/bg Magenta
       Pm = 36 / 46       fg/bg Cyan
       Pm = 37 / 47       fg/bg White
       Pm = 38;5 / 48;5   set fg/bg to colour #m (ISO 8613-6)

따라서 위 출력에서 ​​를 사용하여 색상을 녹색으로 설정하는 xxd것을 볼 수 있습니다 . 반면에 ISO 8613-6(녹색)에 정의된 색상 코드를 나타내는 를 사용합니다. ISO 8613-6에서 색상 0x00-0x07은 표준 색상과 동일하며 0x08 - 0x0f는 표준 "굵은" 색상입니다. 0x10-0xff에 도달하면 새로운 색상을 얻게 됩니다.tput setf 2Pm = 32tput setaf 2Pm = 38;5

에서 도난당함위키피디아:

0x00-0x07:  standard colors (as in ESC [ 30..37 m)
0x08-0x0f:  high intensity colors (as in ESC [ 90..97 m)
0x10-0xe7:  6*6*6=216 colors: 16 + 36*r + 6*g + b (0≤r,g,b≤5)
0xe8-0xff:  grayscale from black to white in 24 steps

답변2

매뉴얼에서:man 5 terminfo

Tektronix 유형 터미널에서 현재 전경색이나 배경색을 변경하려면 다음을 사용하십시오.세타프(ANSI 전경 설정) 및세트탭(ANSI 배경 설정) 또는세트(전경 설정) 및세트(배경 설정). 이는 색상 번호라는 하나의 매개변수를 사용합니다. SVr4 문서에서는 다음 사항만 설명합니다.세타프/세트탭; XPG4 초안에는 다음과 같이 나와 있습니다. "터미널이 배경과 전경을 설정하기 위해 ANSI 이스케이프 시퀀스를 지원하는 경우 다음과 같이 코딩해야 합니다.세타프그리고세트탭, 각각. 터미널이 배경과 전경을 설정하기 위해 다른 이스케이프 시퀀스를 지원하는 경우 다음과 같이 코딩해야 합니다.세트그리고세트, 각각. vidputs() 함수와 새로 고침 함수는 다음을 사용합니다.세타프그리고세트탭정의된 경우."

대답은 다음과 같습니다.세타프수단ANSI 전경 설정즉, ANSI 이스케이프 시퀀스를 사용하고,세트수단전경 설정(ANSI 이외의 일부 이스케이프 시퀀스 사용)

답변3

두 가지 기능 세트는 ANSI 색상 목록에서 빨간색/파란색에 대해 서로 다른 순서를 사용합니다.

언급했듯이 ncurses에 설명되어 있습니다.terminfo 매뉴얼 페이지. 일부 역사:

  • 초기(1990년대 중반), 대부분 사용 가능"색상"사용된 터미널 설명 setf/setb.
  • Sf/Sbtermcap 대신 해당 코드를 사용했지만 termcap을 사용하는 대신 ANSI 이스케이프 시퀀스(termcap과 함께 작동)를 사용하는 termcap 사용자에게 약간의 혼란이 있었습니다 setaf/setab.AF/AB옳은ANSI 기능을 갖춘 기능입니다.
  • 따라서 두 가지가 동일한 터미널 항목을 찾을 수 있습니다. 예:mgterm,인터릭스,더 나은(또한 FreeBSD의 termcap 파일에 있는 여러 항목은 이러한 초기 혼란과 다른 사람들이 프로그램 수정을 꺼려하기 때문에 발생합니다).

ANSI는 setaf/setabterminfo의 역사에서 상당히 늦게 추가되었습니다.기능 문자열 목록. 이러한 것들은 몇 년에 걸쳐 단계적으로 추가되었으며 일부 시스템은 달랐습니다(ncurses에는 다음과 같은 몇 가지 예가 있습니다).Caps.hpux해당 시스템과 일치하도록 컴파일할 수 있습니다). 이는 참조용으로 사용할 수 있는 소수의 유용한 터미널 설명을 설명합니다.

그럼에도 불구하고 기존 setf/setb문자열이 ANSI 순서와 일치하지 않는다는 사실은 즉시 발견되지 않았으며 이로 인해 일부 문제가 발생했습니다.1998년에 수정됨및 자주 묻는 질문왜 빨간색/파란색이 바뀌나요?.

setf/setb8색 ANSI 시퀀스를 16색으로 확장하는 것은 가능했지만(8~15색이 0~7의 더 밝은 버전이라고 가정하여) 처음 16색을 넘어 확장하는 구성표를 고안할 이유가 없었습니다 .

관련 정보