WATCH OUT, the answers here are correct with the given question, i.e limiting the number of read chars to 1 (-n 1) , as soon as one want to read more (i.e read a line) the answers here are not completely correct).
read -e -p "> All good ? (y/n)" -n 1
That is reading only 1 char (-n 1) and answers here are correct.
If one come to here with a similar question but with longer input (no -n1) then all the answers are wrong, as the long input will be screwed up by readline at the line wrap point.
As explained in the answers here:
P="\e[31mPrompt\e[m" ; read -e -p "$P" b
is not good as bash readline don't interpret the \e chars it just display them 'as is'
But:
P=$'\e[31mPrompt\e[m' ; read -e -p "$P" b
is better because the binary string is displayed by readline, but the prompt length is 7 chars longer than visible (the esc sequences) then making readline screwing up the line wrap on long input line, rendering wrongly the editing on the long line.
I found a way to trick readline and have prompt with attribute and yet handle long input. The idea is to emit the prompt with echo (as some have suggested) that will honor the esc sequence attributes and then do a readline with a prompt that has the visual length of the prompt string (PromptLen - escSeqLen) of the attributed echo but actually display nothing, that way readline emit the NOP prompt with correct length, and then handle long line correctly. I come up with this.
P="Prompt :"
echo -ne "\e[31m$P\e[m" ; read -e -p "${P//?/$'\a'}" b
echo "b='$b'"
This works, long line wrap is correctly handled, the drawback now is 'may be' an annoying BELL char, but most of the terminal honor the DECSMBV escape sequence to switch it off.