シェルのテキストの色を変更したいです。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
。
答え2
トーマス・ディッキーが書いたように」彼の意見tput
これは、必要な引数の数を誤って計算する既知のバグです。すでにOpenBSDに報告されています。;これはさらにOpenBSDに関連する他のいくつかの問題tput
これは基本的にOpenBSDの結果です。tput
すでに昔ながら。
このエラーは他の人によって何度も発生したようです([1] [2] [サム] [4] [5])。明らかに、正しい解決策はOpenBSDでこのバグを修正することですが、どうすればよいかわかりません。
3つの可能な解決策があります。
- スチュアート・ヘンダーソンOpenBSDメーリングリストで推奨
tput setaf 5 0 0
最後の2つのパラメータがfalseの場合、回避策として使用されます。これはOpenBSDではうまく機能しますが、他のシステムではエラーが発生するため、OpenBSDを検出して呼び出しを動的に変更する必要がありますtput
。 TERM=xterm
OpenBSDが実行中であることが検出されたときに設定されます。欠点は、OpenBSDユーザーが8つの色しか使用できないことです。- エラーが返されることを確認し、
tput setaf 5
エラーに応じて呼び出し方法を変更します。tput
私としては、問題を解決または解決しようとするエネルギーを無駄にしません。この問題が発生した場合は、プログラムのカラー機能を無効にしたり、OpenBSDでエラー報告を復元したり、OpenBSD自体でエラーを修正したりするオプションがあります。