オンラインまたはさまざまなコードで見る人の ''ファイルから.*rc
。を使用する代わりに、ANSIエスケープシーケンスを手動で使用している人の多くを見る傾向がありますtput
。
私の理解はtput
より一般的で安全なので、これが気になります。
代わりにエスケープシーケンスを使用する必要がある客観的な理由はありますかtput
? (移植性、エラー堅牢性、異常端末…?)
答え1
tput
一般的なシェルスクリプトの作成者があまり役に立たないと見なす式(inやなど)を処理できますsgr
。setaf
関連情報を表示するには、infocmp
適用(形式)オプションの出力を見てください。-f
以下は、xtermでこれらの文字列を使用する例の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つの範囲にマップします。
- 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キー入力が送信する文字シーケンス、カーソルを左に移動するために端末に送信される文字シーケンスなど。
これは、プログラムと端末が独立して動作できるようにするため、両方とも優れています。システムは、使用可能な各端末タイプの機能を含む1つのファイルを維持するだけです。物理端末の場合、このファイルはデフォルトで端末用のドライバーです。ターミナルエミュレータの場合、このファイルはターミナルエミュレータプログラムと共に配布する必要があります。 (各端末タイプのファイルが必ずしも必要ではありませんが、ここでは関係のない実装の詳細にすぎません。)
リモートログインを考慮すると機能しません。rlogin
とのようなプログラムはサーバーのターミナルエミュレータですが、ssh
彼らがすることはクライアントの「実際の」ターミナルに中継するだけです。したがって、独自の端末タイプがなく、TERM
端末で実行されているリモートプログラムがその端末の機能を知るために環境変数を送信します。ただし、サーバー上で実行されているプログラムはサーバーのtermcap / terminfoデータベースから端末名を照会するため、クライアントで使用可能な端末の種類を知らない可能性があります。
1970年代に米国国立標準協会ほぼすべての物理端末に適用される一連の機能を標準化しました。端末エミュレータは引き続きこの規格に従います。すべての端末が同じ機能を持っている場合、端末データベースは実際には役に立ちません。したがって、人々はターミナルデータベースを理解していないか、またはより簡単なので、ターミナルエスケープシーケンスをハードコーディングする習慣に陥ります。ターミナルのドキュメントや実験を参照してください。 termcap/terminfo インターフェイスを学ぶ必要はありません。
さらに、リモートログインが一般的に同じ人が管理する同じサイトの別のコンピュータで行われた時代には、すべてのシステムが他のすべてのシステムの端末を知っていることを確認することは難しくありませんでした。しかし、インターネットではこれは拡張されません。最近ほとんどすべてのグラフィックターミナルエミュレータTERM
はに設定されていますxterm
。これはどこでも知っている端末名だからです。一部TERM
はに設定されておりxterm-256color
、名前がわからない一部のシステムでは問題が発生する可能性があります。
端末の機能を正確に説明する値ではなく、広くサポートされている値に設定する場合の問題は、TERM
以前のバージョンのxtermには存在しなかった機能が欠落していることです。たとえば、古代のxtermは8つの色しかサポートしていなかったため、多くのシステムではtermcap / terminfoデータベース項目に8つの色xterm
数がありました。それでは、別の色を試してみてはいかがでしょうか?たとえば、新しい端末名を定義できます。xterm-256color
現在、多くのシステムでこれを行いますが、すべてではありません。それでも正確ではありません。最新のxtermは24ビットカラーをサポートしています。したがって、256色が必要な場合はtput
リモートログインの問題が発生する可能性があります(実際にはシステムに色があると仮定xterm-256color
)、24ビット色が必要な場合はtput
役に立ちません。
つまり、あまりtput
一般的ではない端末で移植性を提供しますが、機能は犠牲になります。エスケープシーケンスを使用すると、機能制限なしに実際に使用している端末に直接移植できます。
答え4
1つの理由はtput
外部コマンドなので、組み込みのシェルエスケープコードよりも遅く実行できることです。もう1つのことは、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
。