bash color echo: problema com a opção '-n'

0

aqui está minha função para imprimir texto colorido:

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

mas se eu usar a opção -n então nada é impresso:

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

Eu preciso da opção '-n' porque às vezes eu imprimo o texto com apenas uma palavra com cor na linha inteira, como:

$ echo -n "this is "
$ echo "blue" | cecho $blue
    
por user1850133 30.04.2014 / 16:21

3 respostas

1

Eu acho que seu problema está relacionado ao fato de que "ler" requer um fim de linha para ler a entrada. Assim, ele irá travar até que algum tipo de entrada seja inserido (ou seja, para sempre).

Talvez você deva adicionar a opção '-n' ao cecho, ou seja,

$ echo "message | cecho -n $blue

reescreva sua função para verificar o ' -n ' e, em seguida, aplique-o ao echo dentro de cecho .

    
por 30.04.2014 / 17:02
0

A resposta de Michael afirma corretamente que read não está retornando nada porque não há nova linha no final dos dados sendo lidos. Você pode evitar isso alterando a condição while desta forma:

while read line || [ -n "$line" ];
    
por 30.04.2014 / 17:08
0

Para conseguir o que você quer, eu faria algo como o seguinte:

#!/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"

    
por 30.04.2014 / 18:10