私のLinuxボックスに色があるかどうかを確認するには?

私のLinuxボックスに色があるかどうかを確認するには?

私のLinuxコンピュータで次のことをしたいと思います。

if [[ colors exist ]];then
echo "some text in colors"
fi

私の質問は次のとおりです

ログファイルの一部のテキストに色を追加するにはsedを使用していますが、Linuxボックスで色が有効になっていない場合は、[033mなどの不要な文字を追加するなど)、不要な方法でログファイルを変更します。

答え1

おそらくtputを使用して利用可能な色の数を確認できます。

ncolors=$(tput colors)

if [[ $ncolors -ge 8 ]];then
   # colors available
fi

答え2

tty色は端末テキストが表示されます。最近、ほとんどすべての端末はANSIエスケープシーケンスを処理するため、テキストを生成するときに色を指定できますが、実際には文章を書くときに色を指定する必要があります(おそらく書き込み側のユーザーコントロールに応じて)。たとえば、ポケットベルのテキストのカスタムカラーを設定します。

答え3

ターミナルエミュレータで直接実行されているかどうか、または出力がログファイルに書き込まれているかどうかを検出する1つの可能な方法は、次のものを使用することですreadlink

if [[ $(readlink -f /dev/stdout) =~ '^/dev/pts/' ]]; then
   # colors available
fi

これは通常、udevとprocfsを使用する最新のLinuxで動作します。持ち運びやすいものがあるかどうかはわかりません。これは特別なbash正規表現演算子を使用するので、=~bashでのみ機能します。

他の人がすでに説明したように、別のアプローチは;を使用することです。tty >/dev/nullただし、stdinではなくstdoutにのみ興味がある可能性があるため、stdoutを次のstdinにする必要がありますtty

if tty <&1 >/dev/null; then
   # colors available
fi

これにより、走行中は色が無効になりますが、走行./myscript.sh >>log_file中は色が有効になります./myscript.sh

[[ $(tput colors) -ge 8 ]]また、環境変数TERMを に設定すると、dumb色が出力されないようにお使いいただくことをお勧めします。

色を使用してログファイルに書き込む場合でも読み取ることができますが、色をサポートする端末エミュレータなどを使用する必要がless -rあります。multitail -cT ansi

関連情報