tput보다 시퀀스를 이스케이프 처리하는 데 객관적인 이점이 있습니까?


11

사람들의 .*rc파일에서 온라인이나 다양한 코드로 볼 때을 사용하는 대신 수동으로 ANSI 이스케이프 시퀀스를 사용하는 사람들이 많이 tput있습니다.

나는 tput더 보편적이고 안전하다는 이해를 가지고 있었기 때문에 이것이 궁금합니다.

대신에 이스케이프 시퀀스를 사용해야하는 객관적인 이유가 tput있습니까? (이동성, 오류 견고성, 비정상적인 터미널 ...?)


이식성 질문의 반대편에서 MobaXterm은 printfANSI 이스케이프 시퀀스와 작동 하지만 tput실패합니다 (적어도 내 상자에서는).
와일드 카드

답변:


6

tput일반적인 쉘 스크립터가 사용할 수있는 것보다 적은 표현식 (예 : sgrsetaf)을 처리 할 수 ​​있습니다 . 관련된 내용 infocmp을 이해하려면 -f(포맷팅) 옵션이 적용된 출력을 참조하십시오 . 다음은 xterm의 terminfo 설명 에서 해당 문자열을 사용하는 예제 중 하나입니다 .

xterm-16color|xterm with 16 colors,
        colors#16,
        pairs#256,
        setab=\E[
                %?
                        %p1%{8}%<
                        %t%p1%{40}%+
                %e
                        %p1%{92}%+
                %;%dm,
        setaf=\E[
                %?
                        %p1%{8}%<
                        %t%p1%{30}%+
                %e
                        %p1%{82}%+
                %;%dm,
        setb=
                %p1%{8}%/%{6}%*%{4}%+\E[%d%p1%{8}%m%Pa
                %?%ga%{1}%=
                        %t4
                %e%ga%{3}%=
                        %t6
                %e%ga%{4}%=
                        %t1
                %e%ga%{6}%=
                        %t3
                %e%ga%d
                %;
                m,
        setf=
                %p1%{8}%/%{6}%*%{3}%+\E[%d%p1%{8}%m%Pa
                %?%ga%{1}%=
                        %t4
                %e%ga%{3}%=
                        %t6
                %e%ga%{4}%=
                        %t1
                %e%ga%{6}%=
                        %t3
                %e%ga%d
                %;
                m,
        use=xterm+256color,
        use=xterm-new,

서식은 여러 부분을 나눕니다. 스크립트 나 프로그램도 같은 방식으로 전환해야합니다. 대부분의 사람들은 포기하고 가장 쉬운 줄을 사용합니다.

16 색 기능은 IBM aixterm에서 가져 왔으며, 전경 및 배경에 대해 각각 16 개의 코드를 두 개의 범위로 맵핑합니다.

  • 30-37 및 90-97에 전경
  • 40-47 및 100-107에 배경

간단한 스크립트

#!/bin/sh
TERM=xterm-16color
export TERM
printf '    %12s %12s\n' Foreground Background
for n in $(seq 0 15)
do
    F=$(tput setaf $n | cat -v)
    B=$(tput setab $n | cat -v)
    printf '%2d  %12s %12s\n' $n "$F" "$B"
done

출력은 작동 방식을 보여줍니다.

      Foreground   Background
 0        ^[[30m       ^[[40m
 1        ^[[31m       ^[[41m
 2        ^[[32m       ^[[42m
 3        ^[[33m       ^[[43m
 4        ^[[34m       ^[[44m
 5        ^[[35m       ^[[45m
 6        ^[[36m       ^[[46m
 7        ^[[37m       ^[[47m
 8        ^[[90m      ^[[100m
 9        ^[[91m      ^[[101m
10        ^[[92m      ^[[102m
11        ^[[93m      ^[[103m
12        ^[[94m      ^[[104m
13        ^[[95m      ^[[105m
14        ^[[96m      ^[[106m
15        ^[[97m      ^[[107m

aixterm은 30-37 및 40-47 범위를 사용하여 ECMA-48 ( "ANSI"라고도 함) 색상과 일치 시키고 표준에 정의 되지 않은 코드에는 90-107 범위를 사용하기 때문에 숫자가 나뉩니다 .

다음은 xterm을 사용 TERM=xterm-16color하여 효과를 볼 수 있는 스크린 샷입니다 .

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

더 읽을 거리 :


나는 당신의 요점을 증명할지도 모르지만, 이러한 표현들과의 거래는 무엇입니까? infocmp에 대한 매뉴얼을 살펴보면 그들이 if-then-else 문이라는 것을 알고 있습니다 ...하지만 나는 이것을 본 적이 없으며 인터넷 검색에 문제가 있습니다. 이것이 내가 찾은 전부이지만 확실하지 않습니다. 여기서 일어나는 일. 감사!
Captain Man

2

유닉스 플랫폼에 다양한 장치가 연결되어있을 때부터 나는 문자 그대로 이스케이프 시퀀스보다 tput과 그 친구를 선호합니다.

진짜 이유는 대부분의 사람들이 단순히 tput그와 관련된 terminfo/ termcap파일 및 라이브러리에 대해 알지 못하기 때문이라고 생각합니다 .


1

이유 중 하나는 tput외부 명령이기 때문에 내장 쉘 이스케이프 코드보다 느리게 실행될 수 있습니다. 또 다른 것은 ANSI 이스케이프 코드와 쉘 특정 이스케이프 문자를 결합하여 하나의 라이너를 쉽게 만들 수 있다는 것입니다 bash.

PS1='\[\033[1;32m\]\u@\h\[\033[1;34m\] \w >\[\033[0m\] '

비슷하게 zsh:

PS1=$'%{\e[1;32m%}%n@%m%{\e[1;34m%} %3~> %{\e[0m%}'

여기 모든 것이 명확하고 컴팩트합니다. 함께 tput한 여러 줄로 분할하거나 훨씬 더 복잡한 라인을, 실행해야 할 것 tput등을 여러 번


1
tput으로 당신은 여전히 ​​oneliners를 할 수 있습니다 PS1="$(tput setaf 2)\u@\h$(tput reset) >
Captain Man

2
실제로 그것은 $(tput sgr0)결말에 대한 것이지만, tput이 개선되었다는 데 동의합니다.
Thomas Dickey
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.