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


17

이 명령은 tput색상을 설정하기위한 두 가지 옵션이 있습니다, setf그리고 setaf, 아직 모두 내 컴퓨터에서 잘 작동하는 것 :

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

와 비슷한 이중성이있는 것 같습니다 setbsetab.

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


1
자세한 내용 terminfo(5)은 함께 제공 되는 매뉴얼 페이지를 참조 ncurses하십시오.
Stéphane Chazelas 2016 년

답변:


15

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

(다음 모든 정보는 내 터미널이므로 urxvt에만 적용되지만 정보는 동일하지 않으면 다른 터미널과 유사합니다)

모두 setfsetaf다른 이스케이프 코드를 제공합니다. 다음에서이를 볼 수 있습니다.

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

위키 백과 에서 도난당한 경우 :

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

tput그러나 실제로 사용 가능한 ANSI 색상 순서 범위를 사용 하지 않는 것 같습니다 . 어떤을 위해 n > 7, tput setaf n내 터미널에서 텍스트에 영향을주지 않습니다.
Kyle Strand

실제로, 그것은 내 환경의 기발한 것일 수 있습니다. 로부터의 출력 내게 tput setf 2하고 tput setaf 2있다 모두 .[32m .
Kyle Strand

5

매뉴얼에서 : man 5 terminfo

Tektronix 유형 터미널에서 현재 전경색 또는 배경색을 변경하려면 setaf (ANSI 전경 설정) 및 setab (ANSI 배경 설정) 또는 setf (전경 설정) 및 setb (배경 설정)를 사용하십시오. 이들은 하나의 매개 변수, 색상 번호를 사용합니다. SVr4 문서는 setaf / setab 만 설명합니다 . XPG4 초안은 "터미널이 백그라운드 및 포 그라운드를 설정하기 위해 ANSI 이스케이프 시퀀스를 지원하는 경우 각각 setafsetab 로 코딩되어야합니다 . 터미널이 백그라운드 및 포 그라운드를 설정하기 위해 다른 이스케이프 시퀀스를 지원하는 경우 setfsetb각각. vidputs () 함수와 refresh 함수는 setafsetab 이 정의 된 경우이를 사용 합니다. "

따라서 대답은 다음과 같습니다. setafANSI 전경 설정을 의미 합니다 . 즉, ANSI 이스케이프 시퀀스를 사용하고 setfSet Foreground를 의미합니다 (ANSI 이외의 일부 이스케이프 시퀀스 사용).


3

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

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

  • 초기 (1990 년대 중반)에 가장 많이 사용 된 "컬러" 터미널 설명이 사용되었습니다 setf/setb.
  • 해당 사용되는 termcap 사용자와 약간의 혼동이 있었다 Sf/Sb보다는 코드를 setaf/setab(그리고 AF/ABtermcap을 위해) - 그러나 ANSI 이스케이프 시퀀스를 사용하여가 (이 termcap을 작업) 대신 사용하는 것보다 올바른 은 ANSI 기능과 능력을.
  • 따라서 mgterm , interix , beterm 과 같은 두 개의 터미널 항목을 찾을 수 있습니다 (FreeBSD의 termcap 파일에있는 여러 항목뿐만 아니라이 초기 혼동으로 인해 다른 사람들이 프로그램을 수정하지 않기를 꺼려 함).

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

이 모든 점에서 기존 setf/setb문자열이 ANSI 순서와 일치하지 않는다는 사실 은 즉시 눈에 띄지 않았 으며 1998 년 에 일부 수정 사항이 발생했으며 faq는 왜 빨간색 / 파란색으로 바뀌 었 습니까? .

8 색 ANSI 시퀀스를 16 색으로 확장 할 수 있었지만 (8-15 색이 0-7의 밝은 버전이라고 가정 setf/setb하여) 처음 16 색을 넘어 확장하는 구성표를 발명 할 이유는 없었습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.