リダイレクトを使用した色付けとスタイリングを可能にするさまざまなスタイルオプションを使用して、bash用のカラー出力ライブラリを作成しようとしています。パイプでのBashテストで奇妙な動作が発生する
echo "Red" | red
出力赤のテキスト
と
echo "Bold" | bold
出力太字
と
echo "Yellow bold" | yellow | bold
出力太字黄色のテキスト
次のように私がこれまで書いたコードは次のとおりです。
#shellcheck shell=bash
# set debug
# set -o xtrace
# number of colors supported
__colors=$(tput colors 2> /dev/null)
# colors
__black="$(tput setaf 0)"
__red="$(tput setaf 1)"
__green="$(tput setaf 2)"
__yellow="$(tput setaf 3)"
__blue="$(tput setaf 4)"
__magenta="$(tput setaf 5)"
__cyan="$(tput setaf 6)"
__white="$(tput setaf 7)"
# style
__default="$(tput sgr0)"
__bold="$(tput bold)"
__underline="$(tput smul)"
function has_colors() {
COLOR=${COLOR:-auto}
if [[ $COLOR = 'never' ]]; then
return 1
elif [[ $COLOR = 'always' ]]; then
return 0
else
# check if stoud is terminal and terminal supports colors
[[ -t 1 ]] && \
[[ -n $__colors ]] && \
[[ $__colors -ge 8 ]]
fi
}
function __style() {
read -r input
if has_colors; then
echo -e "$1" "$input" "$__default"
else
echo -e "$input"
fi
}
function black() {
__style "$__black"
}
function red() {
__style "$__red"
}
function green() {
__style "$__green"
}
function yellow() {
__style "$__yellow"
}
function blue() {
__style "$__blue"
}
function magenta() {
__style "$__magenta"
}
function cyan() {
__style "$__cyan"
}
function white() {
__style "$__white"
}
function bold() {
__style "$__bold"
}
function underline() {
__style "$__underline"
}
は、色を設定=常にエスケープコードとすべての時間を出力します。一方、COLOR = autoは、現在のstdoutが端末であり、端末が色をサポートしていることを確認するためにいくつかのチェックを実行します。
問題
は常に最後のスタイリングオプションを適用しworking.Itとは思われない複数のスタイリングオプションを使用しています。たとえば:echo "Yellow bold" | yellow | bold
は、太字のテキストを出力しますが、黄色ではありません。一方
:
echo "Bold yellow" | bold | yellow
出力黄色のテキストが、太字ではありません。
面白いのは、 COLOR =を常にうまく使っているようです。それで、stdoutが端末[[ -t 1 ]]
であるかどうかを調べるためのテストのように見えます。そのテストで何らかの遅れがあるので、私はそれがわからない。しかし、私が[[ -t 1 ]]
ビットを削除すると、動作します。
どのように私はこれを達成することができますか? Bashの専門家ではなく、シェルがどのように機能するのかここでかなり混乱しています。
問題が '黄色にすることです|黄色のstdoutはttyではありません。各色の機能をチェックする代わりに、メインスクリプトを一度チェックして、すべての機能が他の人の –
@を使用するという変数を設定する必要があります。一度チェックして出力をファイルにリダイレクトすると、カラーエスケープコードで表示されます。私は欲しいのではない – Bren
set -xvの出力を見ると、太字(2番目と仮定)がスタイル内でecho -e行の前に呼び出され、元の文字列のコピーを受け取っているしたがって、あなたは同じように多くの変更を行うことができ、その結果は常に標準テキストで太字になります。どういうわけか、各パイプに順番にデータを受信させる必要があります(最良の方法ではわからない)。あなたはwaitコマンドを調べることができますか? – grail