たとえば、簡単な方法でカラーテキストを画面に出力する次の方法を見つけました。
RED="\033[0;31m" # Red color (via ANSI escape code);
NC='\033[0m' # No color (via ANSI escape code);
echo -e "${RED}This text is red. ${NC}" # -e flag allows backslash escapes;
または:
printf '\e[1;34m%-6s\e[m' "This is blue text"
私も以下を見つけました:
tput setaf 1; echo "this is red text"
しかし、私はそれを試したことがなく、tput
すべての主要なディストリビューション(Debian、CetnOS、Archなど)が付属しているかどうかはわかりません。
私の質問
「汚れた」カラーコードを使用せずにすべての主要なディストリビューションで作業できる簡単な方法で名前付きの汎用色(「赤」など)を持つカラーテキストを出力するにはどうすればよいですか。
答え1
あなたはそれを使用することができますtput
。
tput
すべての主要ディストリビューションにこの機能が含まれているかどうかはわかりません。
これはncursesの一部であり、これら3つのオペレーティングシステムと他のオペレーティングシステムと一緒にパッケージ化されています。
- Debian ncurses-binパッケージのファイルリスト
stable
- ncursesパッケージのファイルリスト
- ncursesパッケージのFedoraの説明
- FreeBSD ncursesポート/パッケージ内のファイルのリスト
- 実際にはOpenBSD財団の一部です。。
したがって、tput setaf
必要なパッケージをインストールする必要があるという明確な条件下で、幅広いシステムで動作する可能性があります。
欠点は、提供された数字がECMA-48の8つの標準カラーインデックスであるため、これを使用するとまだ「シルバーカラーコード」を使用することになります(一部の端末エミュレータにはさらに8つの事実上標準色がある可能性があります。)デバイスでは、ISO 8613-6インデックスカラーを使用して最大256色を表示できます。
保持の観点から見ると、8つの標準ECMA-48色はよく知られており、色番号として「6」の意味もあまりあいまいではありません。
を使用することもできますsetterm
。
しかし、数字の代わりに名前を使用して(英語でのみ提供されますが)、人間が読むことができるコマンドをさらに探している場合は、そのためのいくつかの広範なツールもあります。そのうちの1つはであり、setterm
使用法は次のとおりです。
% setterm --foreground red; echo "赤いテキストです。"
setterm
Debian、Fedora、およびArch用のリポジトリのutil-linuxツールセットでツールセットを見つけることができます。このコマンドは、特定の機能を達成するために、さまざまなLinux関連トピックに依存しています。その他このコマンドはもちろん、BSDでは利用できない操作を実行できます。ツールセットはい名前が示すように、Linuxは具体的で移植性がありません。
さらに、マニュアルページではterminfoデータベースを参照していると主張していますが、色の変更は実際のプログラムが文書に記載されているように実行されない場合の1つです。それ確かにsetaf
terminfoのおよび機能を参照してくださいsetab
。代わりに、プログラムはECMA-48 SGR 30–37,39,40–47,49制御シーケンスをハードワイヤーします。
また、8から15までの他の8つの事実上の標準カラーインデックスもサポートしていません。少なくとも現在では、「明るい」色をサポートするLinux KVTの機能に追いついていません。受け入れるISO 8613-6インデックスと直接カラー制御シーケンス(実際には24ビットカラー全体を実装していませんが)。
また、ハードワイヤーコードのバグにより、Debian Stable の util-linux バージョンは、setterm
色を設定する際に正しい SGR シーケンスをエクスポートしません。。
setterm
。ユーザーコマンド。マイケルクリーク。 2014年5月。
…今はBSDでも同じです。
setterm
このバグを発見したのは、私が(偶然にも)ちょうど完成した代替を書くようにインスピレーションを与えたものの1つでした。私はLinuxとそのカーネル仮想端末に関連する(通常の)内容をコピーしませんでした。代わりに、util-linuxにはないいくつかのECMA-48エントリを追加しましたsetterm
(Linux KVTはECMA-48のこの部分をサポートしておらず、setterm
そのルートはLinux専用KVTだからです)。また、UTF-8、実際の8ビットC1制御文字(および対応する7ビットエイリアス)サポート、およびISO 8613-6ダイレクトカラー(ターミナルタイプがそれをサポートすることがわかっている場合)を追加しました。
もちろん、この実装はするBSDが存在します:
%名。 printenv用語 FreeBSD 価値を得る % TERM=ansi setterm --7bit --foreground red|hexdump -C 00000000 1b 5b 33 31 6d |.[31m| 00000005 % setterm --7bit --foreground red|hexdump -C 00000000 1b 5b 33 38 3b 35 3b 31 6d |.[38;5;1m| 00000009 % setterm --7bit --foreground 192|hexdump -C 00000000 1b 5b 33 38 3b 35 3b 31 39 32 6d |.[38;5;192m| 0000000b % setterm --7bit --foreground '#00BEC119'|hexdump -C 00000000 1b 5b 33 38 3b 35 3b 31 39 31 6d |.[38;5;191m| 0000000b % TERM=vte-256color setterm --7bit --foreground '#00BEC119'|hexdump -C 00000000 1b 5b 33 38 3b 32 3b 31 39 30 3b 32 35 3b 31 39 |.[38;2;190;25;19| 00000010 33 6d |3m| 00000012 % TERM = ansi setterm --7bit --foreground '明るい赤' --Background '明るい黄色'|hexdump -C 00000000 1b 5b 39 31 6d 1b 5b 31 30 33 6d |.[91m.[103m| 0000000b % setterm --7bit --foreground '明るい赤' --Background '明るい黄色'|hexdump -C 00000000 1b 5b 33 38 3b 35 3b 39 6d 1b 5b 34 38 3b 35 3b |.[38;5;9m.[48;5;| 00000010 31 31 6日| 11分| 00000013 %
これは、Noshツールセットバージョン1.39のutil -linuxという端末管理パッケージに含まれており、console-control-sequence
util-linuxと共存できます。コマンドの shim 名はsetterm
別の shim パッケージで提供されます。だから色を変更するために何かを書いて、setterm
誰かがそれがLinuxに限定されていると主張するならば、それらをどこに指示するべきかを知ることができます。マンページをプレビューとして含めました。
- ジョナサンデボインポラード(2018)。
setterm
。 スナックガイド。ソフトウェア。
ちなみに、SGRコードを正しく入手してください。
SGR 0いいえ「色がない」。 SGR 0はすべての色と属性をリセットします。実際、「いいえ」色という概念はありません。そこはいSGR 39およびSGR 49によって設定された「基本」色の概念:
% setterm --7bit --foreground デフォルト --Background デフォルト |hexdump -C 00000000 1b 5b 33 39 6d 1b 5b 34 39 6d |.[39m。 [49m | 0000000a %
答え2
コード(ANSIカラーコード)
コードはディストリビューションとは無関係です。彼らは末期依存です。一部の端末ではこれをサポートしていません。しかし、彼らは大半の人口の支持を受けることができます。
名前
たとえば、変数を使用して名前を指定します。
red="$(tput setaf 1)"
echo "${red}hello"
注:シェル変数に大文字を使用しないでください。大文字は環境変数に予約する必要があります。
名前とコード
このコードは色番号を表します。各番号の色は端末によって定義され、標準ではありません。ユーザーが変更できます。