web-dev-qa-db-fra.com

Commande de lecture: affichez l'invite en couleur (ou activez l'interprétation des échappements de barre oblique inverse)

J'utilise souvent quelque chose comme read -e -p "> All good ? (y/n)" -n 1 confirm; pour demander une confirmation à l'utilisateur.

Je cherche un moyen de coloriser la sortie, comme le fait la commande echo -e:

echo -e "\033[31m";
echo "Foobar";       // will be displayed in red
echo -e "\033[00m";

J'utilise xterm.

Dans man echo, il est écrit: 

-e permet l'interprétation des échappements de barre oblique inverse

Existe-t-il un moyen de faire la même chose avec la commande read? (Rien dans la page de manuel: L'option (-r ne fonctionne pas)

17
4wk_

read ne traitera aucune échappée spéciale dans l'argument de -p, vous devez donc les spécifier littéralement. Les chaînes citées par ANSI de bash sont utiles pour cela:

read -p $'\e[31mFoobar\e[0m: ' foo

Vous devriez aussi pouvoir taper un caractère d'échappement littéral avec Control-vEscape, qui apparaîtra sous la forme ^[ dans le terminal:

read -p '^[[31mFoobar^[[0m: ' foo
29
chepner

Divisez votre requête en deux composants:

  1. utilisez echo -e -n pour afficher l'invite
  2. recueillir la réponse de l'utilisateur en lecture

par exemple:

echo -e -n "\e[0;31mAll good (y/n)? "   # Display Prompt in red
echo -e -n '\e[0;0m'                    # Turn off coloured output
read                                    # Collect the user input

L'option echo -n supprime le retour à la ligne final.

15
Beggarman

J'ai une autre solution qui vous permet d'utiliser des variables pour changer le format du texte. Je echo -e la sortie que je veux dans l'argument -p de la commande read.

Voici un exemple:

RESET="\033[0m"
BOLD="\033[1m"
YELLOW="\033[38;5;11m"
read -p "$(echo -e $BOLD$YELLOW"foo bar "$RESET)" INPUT_VARIABLE
13
Vrakfall

ça marche pour moi:

    BC=$'\e[4m'
    EC=$'\e[0m'

    while true; do
            read -p "Do you wish to copy table from ${BC}$Host $PORT${EC} to ${BC}$LOCAL_Host $LOCAL_PORT${EC}? (y or n)" yn
        case $yn in
        ....
    done

Les résultats sont les suivants:  enter image description here

plus d’exemple, voir la vitrine, le lien est:

mysqlis

1
LuciferJack