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 \e
istemine 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
, RED
ve NONE
bunları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 PS1
iç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\1
ve\[
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 .