Como obter um fundo oposto por eco

0

Se eu usar o modo 0 , podemos definir a cor da fonte e do plano de fundo, shuc as

echo -e "\e[0;31;47m teststring \e[0m"

Maseuesperousarumacoropostaparaserumacordefundo(achoqueéciano).Entãoeuquerousaromodo7(modo7teráumfundooposto).Masnãottrabalhesempre:

Qualquer corpo pode me dizer como usar este modo?

    
por yode 03.07.2017 / 05:17

3 respostas

1

Leia atentamente a página wiki em códigos de escape ANSI ; você poderia usar \e[46m etc

    
por 03.07.2017 / 06:54
2

\e[7m é o código para vídeo reverso (também usado frequentemente para o modo standout ) na maioria dos terminais. O que isso faz é substituir a cor do plano de fundo pela cor do primeiro plano e a cor do primeiro plano pela cor do plano de fundo, e não pelo vídeo reverso como em um negativo fotográfico.

Para o negativo fotográfico, alguns terminais suportam o seguinte:

\e[38;2;RED;GREEN;BLUEm  # for foreground
\e[48;2;RED;GREEN;BLUEm  # for background

seqüências de escape, onde RED , GREEN , BLUE é um número decimal de 0 a 255. Isso indica ao terminal para escolher uma cor na paleta mais próxima da especificação RGB.

Então você poderia fazer:

straight_color() {
   printf '[48;2;%s;%s;%sm[38;2;%s;%s;%sm' "$@"
}
negative_color() {
  for c do
    set -- "$@" "$((255 - c))"
    shift
  done
  straightcolor "$@"
}

E, por exemplo,

straight_color 255 0 0  255 255 255

Para primeiro plano branco brilhante em fundo vermelho brilhante e:

negative_color 255 0 0  255 255 255

para o negativo (preto em ciano claro).

    
por 03.07.2017 / 13:00
0

A melhor maneira de lidar com isso é usar a biblioteca terminfo . É muito mais fácil do que lembrar códigos de escape e, geralmente, menos propensos a erros. (Também é agnóstico de terminal, mas suspeito que seja improvável que você esteja usando um dispositivo de terminal não-ANSI atualmente.)

# Use reversed colours
tput smso
echo hello, world
tput rmso

Você pode até colocar os códigos em variáveis programaticamente, como este

smso=$(tput smso)
rmso=$(tput rmso)

echo "${smso}Hello again${rmso}"

Também há controles de cores usando tput setf {colour} e tput setb {colour} . (Pesquisa man terminfo para "Color Handling".) Estes são mais complicados, então eu costumo usar um pequeno script para lidar com eles

colour blue yellow
echo this is blue on yellow

Aqui está o script

#!/bin/sh
#
# Take a pair of colours and set the foreground and background,
# respectively.
#
########################################################################
#
NULL=/dev/null

fg="$1"
bg="$2"


########################################################################
# Translate a colour name to the corresponding ANSI index value
#
colourNo ()
{
    case "$1" in
        black|0)        echo 0  ;;
        blue|1)         echo 1  ;;
        green|2)        echo 2  ;;
        cyan|3)         echo 3  ;;
        red|4)          echo 4  ;;
        magenta|5)      echo 5  ;;
        yellow|6)       echo 6  ;;
        white|7)        echo 7  ;;
    esac
    return
}


########################################################################
# Go
#
if test "X$1" = 'X-?'
then
    progname='basename "$0"'
    echo "Usage:  $progname  [<fg_colour>|-  [bg_colour]]" >&2
    exit 1
fi

if test -n "$fg" -a "X$fg" != "X-"
then
    colour='colourNo "$fg"'
    test -n "$colour" && tput setf "$colour"
fi

if test -n "$bg" -a "X$bg" != "X-"
then
    colour='colourNo "$bg"'
    test -n "$colour" && tput setb "$colour"
fi

exit 0
    
por 03.07.2017 / 11:18

Tags