Команда чтения: отображение приглашения в цвете (или включение интерпретации обратных слэшей)

Я часто использую что-то вроде read -e -p "> All good ? (y/n)" -n 1 confirm;, чтобы запросить подтверждение для пользователя.

Я ищу способ раскрасить результат, так как команда echo -e делает:

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

Я использую xterm.

В man echo говорится:

-e включить интерпретацию обратных слэшей

Есть ли способ сделать то же самое с командой read? (ничего в man-странице:(-r опция не работает)

Ответ 1

read не будет обрабатывать какие-либо специальные escape-последовательности в аргументе -p, поэтому вам нужно будет указать их буквально. bash Для этого полезны строки с кодами ANSI:

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

Вы также должны иметь возможность ввести буквенный escape-символ с Control - v Escape, который будет отображаться как ^[ в терминале:

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

Ответ 2

Разделите запрос на два компонента:

  • используйте echo -e -n для отображения приглашения
  • получить ответ пользователя с помощью

например:

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

Параметр echo -n подавляет конечную новую строку.

Ответ 3

У меня есть другое решение, которое позволяет использовать переменные для изменения текстового формата. я echo -e вывод, который я хочу включить в аргумент -p команды read.

Вот пример:

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

Ответ 4

эта работа для меня:

    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

Результаты следующие: введите описание изображения здесь

еще один пример, см. пример, ссылка:

mysqlis