온라인이나 다양한 코드에서 보는 사람들의 ' ' 파일에서 .*rc
. 을 사용하는 대신 ANSI 이스케이프 시퀀스를 수동으로 사용하는 사람들을 많이 보는 경향이 있습니다 tput
.
내 이해는 tput
더 일반적이고 안전하므로 이것이 궁금합니다.
대신 이스케이프 시퀀스를 사용해야 하는 객관적인 이유가 있나요 tput
? (이식성, 오류 견고성, 비정상 단말...?)
답변1
tput
일반적인 쉘 스크립트 작성자가 덜 유용하다고 간주하는 표현식(예: in 및 )을 처리할 수 있습니다 sgr
. setaf
관련된 내용을 보려면 infocmp
적용(형식) 옵션의 출력을 살펴보세요. -f
다음은 xterm에서 이러한 문자열을 사용하는 예 중 하나입니다.용어 정보 설명:
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은 ECMA-48("ANSI"라고도 함) 색상을 일치시키기 위해 30-37 및 40-47 범위를 사용하고 코드에 대해 90-107 범위를 사용하므로 이러한 숫자는 구분됩니다.아니요표준에 정의되어 있습니다.
TERM=xterm-16color
다음은 효과를 볼 수 있는 xterm 사용의 스크린샷입니다 .
추가 자료:
답변2
UNIX 플랫폼이 다양한 장치를 연결할 수 있는 시대에도 나는 여전히 문자 그대로의 이스케이프 시퀀스보다 tput과 그 친구들을 선호합니다.
내 생각에 진짜 이유는 대부분의 사람들이 단순히 tput
그것과 관련된 terminfo
/ termcap
파일과 라이브러리를 이해하지 못하기 때문이라고 생각합니다.
답변3
장점 tput
은 터미널이 수행할 수 있는 작업과 수행 방법을 찾아 터미널에 대한 올바른 정보를 얻을 수 있다는 것입니다. 단점 tput
은 터미널이 수행할 수 있는 작업과 수행 방법을 조회하므로 터미널에 대한 잘못된 정보를 얻을 수 있다는 것입니다.
tput
정보 찾기용어 정보데이터베이스 또는 이전 시스템용어 모자데이터 베이스. 이것이 작동하는 일반적인 방법은 터미널이 시작될 때 시스템이 TERM
환경 변수를 터미널 이름으로 설정하는 것입니다. 물리적 터미널의 경우 이는 다음과 같습니다.getty
. 터미널 에뮬레이터의 경우 이는 터미널 에뮬레이터 프로그램의 작업입니다. 터미널(포함)에서 실행되는 프로그램이 termcap 또는 terminfo 데이터베이스에서 검색하는 값 tput
입니다. 둘 다 터미널 이름을 "기능"에 매핑합니다. TERM
터미널 기능은 터미널이 수행할 수 있는 작업과 수행 방법을 나타냅니다. 줄 바꿈 가능 여부, 열 수, Left키 입력이 보내는 문자 시퀀스, 커서를 왼쪽으로 이동하기 위해 터미널로 전송되는 문자 시퀀스 , 등.
이는 프로그램과 터미널이 독립적으로 작동할 수 있게 해주기 때문에 모두 훌륭합니다. 시스템은 사용 가능한 각 터미널 유형에 대한 기능을 포함하는 하나의 파일만 유지하면 됩니다. 물리적 터미널의 경우 이 파일은 기본적으로 터미널용 드라이버입니다. 터미널 에뮬레이터의 경우 이 파일은 터미널 에뮬레이터 프로그램과 함께 배포되어야 합니다. (각 터미널 유형에 대한 파일이 반드시 있어야 하는 것은 아니지만 여기서는 관련이 없는 구현 세부 사항일 뿐입니다.)
원격 로그인을 고려할 때는 작동하지 않습니다. rlogin
및 와 같은 프로그램은 서버의 터미널 에뮬레이터 이지만 ssh
이들이 하는 일은 클라이언트의 "실제" 터미널에 중계하는 것뿐입니다. 따라서 자체 터미널 유형이 없으며 TERM
터미널에서 실행되는 원격 프로그램이 해당 터미널의 기능을 알 수 있도록 환경 변수를 전송합니다. 그러나 서버에서 실행되는 프로그램은 서버의 termcap/terminfo 데이터베이스에서 터미널 이름을 조회하므로 클라이언트에서 사용 가능한 터미널 유형을 알지 못할 수도 있습니다.
1970년대에는미국 국립표준협회거의 모든 물리적 터미널에 적용되는 일련의 기능을 표준화했습니다. 터미널 에뮬레이터는 계속해서 이 표준을 따릅니다. 모든 터미널이 동일한 기능을 갖고 있는 경우 터미널 데이터베이스는 실제로 쓸모가 없습니다. 따라서 사람들은 터미널 데이터베이스를 이해하지 못하거나 더 쉽기 때문에 터미널 이스케이프 시퀀스를 하드코딩하는 습관에 빠지게 됩니다. 터미널의 문서나 실험을 참고하면 되며 termcap/terminfo 인터페이스를 배울 필요가 없습니다.
또한 원격 로그인이 일반적으로 동일한 사람이 관리하는 동일한 사이트의 다른 컴퓨터에 이루어졌던 시절에는 모든 시스템이 다른 모든 시스템의 터미널을 알고 있는지 확인하는 것이 어렵지 않았습니다. 그러나 인터넷에서는 이것이 확장되지 않습니다. 요즘 거의 모든 그래픽 터미널 에뮬레이터 TERM
는 으로 설정되어 있습니다 xterm
. 이는 어디에서나 알고 있는 터미널 이름이기 때문입니다. 일부는 TERM
로 설정되어 xterm-256color
있으며 이름을 모르는 일부 시스템에서는 문제가 발생할 수 있습니다.
터미널의 기능을 정확하게 설명하는 값이 아닌 널리 지원되는 값으로 설정하는 경우의 문제점은 TERM
이전 버전의 xterm에는 존재하지 않았던 기능이 누락된다는 것입니다. 예를 들어, 고대 xterm은 8가지 색상만 지원했기 때문에 많은 시스템에서 termcap/terminfo 데이터베이스 항목에 xterm
색상 수가 8개라고 나와 있었습니다. 그렇다면 다른 색상을 사용해 보는 것은 어떨까요? 예를 들어 새 터미널 이름을 정의할 수 있습니다. xterm-256color
현재 많은 시스템에서 이 작업을 수행하지만 전부는 아닙니다. 심지어 정확하지도 않습니다. 최신 xterm은 24비트 색상을 지원합니다. 따라서 256색을 원하면 tput
원격 로그인 문제가 발생할 수 있지만(실제로 시스템에 색상이 있다고 가정 xterm-256color
) 24비트 색상을 원하면 tput
도움이 되지 않습니다.
즉, tput
덜 일반적인 터미널에서 이식성을 제공하지만 기능은 희생됩니다. 이스케이프 시퀀스를 사용하면 기능 제한 없이 실제로 사용 중인 터미널로 직접 이식할 수 있습니다.
답변4
한 가지 이유는 tput
외부 명령이므로 내장된 쉘 이스케이프 코드보다 느리게 실행될 수 있다는 것입니다. 또 다른 점은 bash
프롬프트 에서 ANSI 이스케이프 코드와 쉘별 이스케이프 문자를 결합하는 라이너를 쉽게 만들 수 있다는 것입니다 .
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
.