답변:
tput
일반적인 쉘 스크립터가 사용할 수있는 것보다 적은 표현식 (예 : sgr
및 setaf
)을 처리 할 수 있습니다 . 관련된 내용 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 개의 코드를 두 개의 범위로 맵핑합니다.
간단한 스크립트
#!/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
하여 효과를 볼 수 있는 스크린 샷입니다 .
더 읽을 거리 :
이유 중 하나는 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
등을 여러 번
PS1="$(tput setaf 2)\u@\h$(tput reset) >
$(tput sgr0)
결말에 대한 것이지만, tput이 개선되었다는 데 동의합니다.
printf
ANSI 이스케이프 시퀀스와 작동 하지만tput
실패합니다 (적어도 내 상자에서는).