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

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

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

$ 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 사용자는 대신 해당 코드 setaf/setab(termcap도 포함 AF/AB)를 사용하지만 다음 대신 ANSI 이스케이프 시퀀스(termcap과 함께 사용)를 사용합니다.옳은ANSI 기능을 갖춘 기능.
  • 따라서 두 가지 모두와 동일한 터미널 항목을 찾을 수 있습니다. 예를 들어,mg 용어,색인,베뎀(또한 초기 혼란과 다른 사람들이 프로그램 수정을 꺼렸기 때문에 FreeBSD의 termcap 파일에 있는 여러 항목도 마찬가지입니다.)

ANSI는 setaf/setabterminfo의 역사에서 아주 늦게 추가되었습니다. terminfo에서의 위치에서 추론할 수 있듯이기능 문자열 목록. 이것들은 몇 년에 걸쳐 단계적으로 추가되었으며 일부 시스템은 다양하다는 점을 명심하십시오(ncurses에는 몇 가지 예가 있습니다.Caps.hpux이러한 시스템과 일치하도록 컴파일하십시오. 이는 참조할 수 있는 소수의 유용한 터미널 설명을 보여줍니다.

그럼에도 불구하고 setf/setb기존 문자열이 ANSI 순서와 일치하지 않는다는 사실이 즉시 인식되지 않아 몇 가지 문제가 발생했습니다.1998년에 복원됨및 FAQ왜 빨간색/파란색으로 바뀌었나요?.

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

관련 정보