OpenBSDの 'setaf'関数にパラメータが不足しています。

OpenBSDの 'setaf'関数にパラメータが不足しています。

シェルのテキストの色を変更したいです。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ドキュメントtputterminfo、属性は、またはで定義する必要がありますtermcapsetaf定義が見えない出荷書類ビーチtermcapだから、私はtput解釈が次のようsetafになると仮定します。出荷書類ビーチterminfo。この文書によると:

Tektronixタイプの端末で現在の前景色または背景色を変更するには、次のようにします。セタフ(ANSI前景設定)とセットタブ(ANSI背景設定)またはセテフ(前景設定)と設定値(背景設定)。カラー番号という1つのパラメータを使用します。

これはエラーメッセージが言う内容と矛盾します。一方、tput setaf 5 0 0andを使用すると、最後の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=xtermOpenBSDが実行中であることが検出されたときに設定されます。欠点は、OpenBSDユーザーが8つの色しか使用できないことです。
  • エラーが返されることを確認し、tput setaf 5エラーに応じて呼び出し方法を変更します。tput

私としては、問題を解決または解決しようとするエネルギーを無駄にしません。この問題が発生した場合は、プログラムのカラー機能を無効にしたり、OpenBSDでエラー報告を復元したり、OpenBSD自体でエラーを修正したりするオプションがあります。

関連情報