シェルのテキストの色を変更したいです。tput
正しいエスケープコードを取得するために使用できます。例えば、
echo "$(tput setaf 5)My text$(tput sgr0)"
出力にはMy text
ピンク色の色合いがあります。
これはLinux、macOS、FreeBSD、NetBSD、およびSolarisでうまく機能します。ただし、OpenBSD 7.2では、次のエラーが発生します。
tput: not enough arguments (3) for capability `setaf'
~によるとOpenBSDドキュメントtput
terminfo
、属性は、またはで定義する必要がありますtermcap
。setaf
定義が見えない出荷書類ビーチtermcap
だから、私はtput
解釈が次のようsetaf
になると仮定します。出荷書類ビーチterminfo
。この文書によると:
Tektronixタイプの端末で現在の前景色または背景色を変更するには、次のようにします。セタフ(ANSI前景設定)とセットタブ(ANSI背景設定)またはセテフ(前景設定)と設定値(背景設定)。カラー番号という1つのパラメータを使用します。
これはエラーメッセージが言う内容と矛盾します。一方、tput setaf 5 0 0
andを使用すると、最後の2つのパラメータに関係なく、前景色がピンク色に変わります。
OpenBSDに3つのパラメータが必要なのはなぜtput
ですか。これら2つの追加パラメータはどういう意味ですか?
ベストアンサー1
私が覚えている限りtput
(20年?多分それ以上)、さまざまなUNIX型システムで使用されている標準的な期待は次のとおりです。
tput setaf
使用するANSIカラー番号を表示するには数字が必要です。他のものはおそらく間違いです。tput sgr0
パラメータは必要ありません。- チェーンで接続できますが(
tput setaf 5 sgr0
)、この特定の構成はすぐにリセットされる色の変更をエクスポートするため、意味がありません。
tput setaf
あなたの場合は、複数の数字が必要であることを繰り返します。バグかもしれません。
tput setaf 5 0 0
私のDebianベースのシステムでは、これが許可され、予期しない末尾の値が無視されるため(エラーなし)、他のシステムを損なうことなくOpenBSDエラーを満たすことができることがわかりました。 (他のコマンドにも同じことが当てはまりますtput
。追加の末尾引数は許可されますが無視されます。)しかし、これが常にそうでない場合は、次のコードが適していますが、必要な回避策を提供できます。
# Work around OpenBSD bug https://gitlab.com/jschx/ufetch/-/merge_requests/61
tputbug=; tput setaf 0 >/dev/null 2>&1 || tputbug='0 0'
tput setaf 2 $tputbug
ちなみに、多くのカラーコードを使用する場合は、コマンドの実行が1行に1回ではなく、各色に対して1回実行されるように変数にキャプチャすることをお勧めします。
magenta=$(tput setaf 5 $tputbug)
normal=$(tput sgr0)
echo "${magenta}My text${normal}"
他の読者への注意:変数には通常中括弧は必要ありませんが($magenta
完全に許可されています)、この場合は直後のテキストから変数名を区切るために使用されます。それ以外の場合は、名前が設定されていない変数になります$magentaMy
。