fand ich diese Frage bei der Suche des GNU verfeinern Readline- in einem Bash-Skript veranlassen. Wie readline in C-Code, \[
und \]
sind nicht speziell, aber \001
und \002
funktionieren , wenn buchstäblich gegeben über die spezielle Behandlung bash bietet zitiert Wörter der Form $'string'
. Ich war schon einmal hier (und bin nicht zufrieden gewesen, weil ich nicht wusste, ob ich es mit $'…'
kombinieren könnte), also dachte ich, ich würde meine Erklärung hier lassen, dass ich eine Lösung habe.
die Daten hier mit Hilfe des mitgelieferten war ich in der Lage, dieses Ergebnis zu dem Schluss:
C1=$'\001\033[1;34m\002' # blue - from \e[1;34m
C0=$'\001\033[0;0m\002' # reset - from \e[0;0m
while read -p "${C1}myshell>$C0 " -e command; do
echo "you said: $command"
done
ein blaues Prompt Dies gibt die myshell>
und hat einen hinteren Raum sagt, ohne Farben für den aktuellen Befehl. Schlagen Up oder Eingabe und Befehl, die in die nächste Zeile umbrochen werden nicht mehr durch die nicht druckbaren Zeichen verwechselt werden.
Wie in der akzeptierten Antwort erklärt, \001
(Start of Heading) und \002
(Start of Text) ist der RL_PROMPT_START_IGNORE
und RL_PROMPT_END_IGNORE
Marker, die bash sagen und readline nichts zwischen ihnen zum Zweck des Terminals zählen zu malen. (Auch hier gefunden: \033
ist zuverlässiger als \e
und da ich jetzt sowieso oktal Codes verwende, könnte ich auch einen mehr verwenden.)
Es scheint ziemlich der Mangel an Dokumentation zu diesem Thema; das Beste, was ich war in Perl in der Dokumentation Term::ReadLine::Gnu, die sagt finden konnten:
PROMPT
können einige Escape-Sequenzen. Verwenden Sie RL_PROMPT_START_IGNORE
, um eine Sequenz von nicht druckbaren Zeichen zu beginnen, und RL_PROMPT_END_IGNORE
, um die Sequenz zu beenden.
Solche Escaping-Sequenzen sind eine Bash-spezifische Sache. Wenn Sie aus einem Programm drucken, benötigen Sie die umgebenden Klammern nicht. Beachten Sie auch, dass die Sequenz '" \ e "' eine Erweiterung im GCC-Compiler ist und nicht generell portabel ist. –
Um meinen vorherigen Kommentar zu verdeutlichen, meine ich, dass das Paar "" und "" "Bash-spezifisch ist und Sie es nicht brauchen. –
Haben Sie 'readline (" \ [\ 033 [1; 31m $ \ 033 [0m \] ")' versucht? '\ 033' anstelle von' \ e' –