bashカラーエコー: "-n"オプションの問題

bashカラーエコー: "-n"オプションの問題

これはカラーテキストを印刷する機能です。

cecho()
{
color=${1:-""}       #  defaults to original color if no color specified
colorreset="\E[0m"   #  back to black after function return
while read line; do
  echo -e "$color$line$colorreset"
done
return
}

$ blue="\E[34m"
$ echo "message" | cecho $blue
$ message  #  it appears in blue

ただし、-nオプションを使用すると何も印刷されません。

$ echo -n "message" | cecho $blue
$

「-n」オプションが必要なのは、印刷するテキストに行全体のカラーワードのみが含まれているためです。たとえば、次のようになります。

$ echo -n "this is "
$ echo "blue" | cecho $blue

答え1

あなたの問題は、「読み取り」が入力を読むために行末が必要であるという事実に関連していると思います。したがって、一部の入力が提供されるまで(つまり永久に)停止します。

たぶん、cechoに '-n'オプションを追加する必要があります。

$ echo "message | cecho -n $blue

-nその後、関数を書き直して「」を確認し、echo内部に適用しますcecho

答え2

Michaelの答えは、read読んでいるデータの末尾に改行文字がないので何も返されないと正しく明示しています。while次のように条件を変更すると、これを防ぐことができます。

while read line || [ -n "$line" ];

答え3

必要なものを達成するには、次のようにします。

#!/bin/bash

cecho()
{
color="${1:-""}"
colorreset=$(tput sgr0)    #  back to black after function return
while read line; do
 if [[ ! -n $color  ]]; then
  printf '%s\n' "$line $colorreset"
 else
  printf '%s\n' "$1$line $colorreset" 
fi
done
return
}
cecho "$1"

ここに画像の説明を入力してください。

関連情報