人々の '.*rc
'ファイルをオンラインまたはさまざまなコードで見ると、tput
を使用する代わりに手動でANSIエスケープシーケンスを使用する多くの人に会う傾向があります。
tput
の方が普遍的で安全であると理解していたので、次のように思います。
tput
の代わりにエスケープシーケンスを使用する必要がある客観的な理由はありますか? (移植性、エラーに対する堅牢性、異常な端末...?)
tput
は式を処理できます(たとえば、sgr
とsetaf
内)。これは、一般的なシェルスクリプトでは使用できないと判断されます。何が関係しているのかを理解するには、-f
(フォーマット)オプションを適用したinfocmp
からの出力を参照してください。これは、xtermの terminfo description からのこれらの文字列を使用した例の1つです。
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個のコードを2つの範囲にマッピングします。
簡単なスクリプト
#!/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の範囲を使用するため、数値は分割されますnot定義標準で。
これは、TERM=xterm-16color
を使用したxtermのスクリーンショットです。ここで効果を確認できます。
参考文献:
UNIXプラットフォームにさまざまなデバイスを接続できる時代から来た私は、文字通りのエスケープシーケンスよりもtputとその仲間の方がずっと好きです。
本当の理由は、ほとんどの人がtput
とそれに関連するterminfo
/termcap
ファイルとライブラリについて知らないからだと思います。
その理由の1つは、tput
が外部コマンドであるため、組み込みのシェルエスケープコードよりも実行が遅くなる可能性があるためです。もう1つのことは、たとえばbash
プロンプトのように、ANSIエスケープコードとシェル固有のエスケープ文字を組み合わせた1つのライナーを簡単に作成できることです。
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
を複数回実行する必要があります。