Gilles ana probleminizi belirledi, ama ben farklı bir şekilde açıklamayı denemek istedim.
Bash, özel bilgi isteminin kaçışlarını yalnızca bilgi istemindeki değişkenleri genişletmeden önce yorumlar . Bu \e, doğrudan çalışmasına rağmen bilgi isteminden genişletilen bir değişkende kullanılmasının işe yaramayacağı anlamına gelir PS1.
Örneğin, bu beklendiği gibi çalışır ve kırmızı metin verir:
PS1='\e[1;31m this is in red '
Ama bu değil, sadece bilgi \eistemine neden olur:
RED='\e[1;31m'
PS1="$RED not in red "
Renk çıkışlarını değişkenlerde saklamak istiyorsanız, değişkene $'...'değişmez bir kaçış karakteri koymak için ANSI-C quoting ( ) kullanabilirsiniz.
Bunu yapmak için, sizin tanımı değiştirebilir GREEN, REDve NONEbunların değeri gerçek çıkış sırası yani.
GREEN=$'\033[1;32m'
RED=$'\033[1;31m'
NONE=$'\033[m'
Bunu yaparsanız PS1, tek tırnak işareti ile ilk çalışmanız gerekir:
PS1='${RED}\h $(get_path) ${exitStatus}${NONE} '
Ancak, ikinci bir sorununuz olacaktır.
Bunu çalıştırmayı deneyin Up Arrow, ardından Home, tuşuna basın ; imleciniz satırın başına gitmeyecektir.
Bunu düzeltmek için, renk kaçış dizilerini PS1içerecek \[ve \]çevresinde olacak şekilde değiştirin
PS1='\[${RED}\]\h $(get_path) $?\[${NONE}\] '
get_exit_statusÇıktısı hem yazdırma (çıkış kodu) hem de yazdırma dışı karakterler (renk kodları) içerdiğinden ve istemde doğru olarak işaretlemenin bir yolu olmadığından burada düzgün şekilde kullanamazsınız . Koymak \[...\]onu tam olarak yazdırmamak olarak işaretler, ki bu doğru değildir. İşlevi yalnızca uygun renk kodunu yazdıracak şekilde değiştirmeniz ve ardından \[...\]istemde çevrelemeniz gerekir .
\[olduğu\1ve\[bir\2. BunlarRL_PROMPT_{START,END}_IGNORE, ekranda bilgi istemi uzunluğunu sayarken baytları göz ardı etmesini isteyen bazı readline öğelerine karşılık gelir . Bkz. Lists.gnu.org/archive/html/bug-bash/2015-08/msg00027.html .