印刷物から色を削除して配管に適したものにする方法

印刷物から色を削除して配管に適したものにする方法

私はいくつかのUnixコマンドを送信するために私のスクリプトを使用しています。問題は、私のスクリプトで色を使用していることです。たとえば、

yellow=`tput setaf 3`
reset=`tput sgr0`

function Warning()
{
    echo "${yellow}$*${reset}"
}

使用できるコマンドがありますWarning "Compress $directory"

これをfindコマンドに入力したいと思います。

私は以下を使用しています:

./compress.sh | grep Push | awk '{print $2}' | while read directory; do find $directory | wc -l; done;

ただし、次のエラーが発生します。

find: '/some_directory\033(B\033[m']: そのファイルまたはディレクトリがありません 0

awk印刷の終わりに見えない文字が追加されたか、色がパイピングと混同されているようです。

このエラーが発生するのはなぜですか?どうすればいいですか?

答え1

端末の色はエスケープシーケンスを介して機能します。${yellow}実際には\033[0;33m(または\e[0;33m${reset}です\033[0m。試してみることができますecho -e '\e[0;33m yellow \e[0m'基本カラーコードリスト)。

\033ASCIIおよびUnicodeでEscapeである8進数033を表す文字です。\e脱出するもう一つの方法だ。[コードの始まりを表示し、mコードの終わりを表示します。

ほとんどのプログラムはカラーコードを解釈できないため、パイプを使用している場合は無効にする必要があります。あなたはできますプログラムがパイプラインで実行されているかどうかを検出する[[ -t 1 ]]trueの場合はターミナルに書いているもので、falseの場合は別の場所に書くことです。おそらくパイプです。

これは、端末に印刷するときにのみ色を出力します。

yellow=''
reset=''
if [[ -t 1 ]]; then
    yellow=`tput setaf 3`
    reset=`tput sgr0`
fi

function Warning()
{
    echo "${yellow}$*${reset}"
}

関連情報