Masalah PS1, mengacaukan CLI

16

Saya melakukan tugas PS1 sederhana

PS1="\e[0;31m[\W]\$ \e[m "

Yang ingin saya lakukan adalah mengubah warna prompt dan hanya menampilkan jalur relatif. Namun ini mengacaukan CLI. Misalnya, ketika menelusuri riwayat dengan itu memotong dan tumpang tindih tampilan. Ketika saya mengetik perintah panjang, kursor bergerak ke awal layar yang tumpang tindih dengan tampilan prompt itu sendiri. Apa yang telah saya lakukan salah?

yayu
sumber

Jawaban:

30

Itu karena bash mengira prompt lebih panjang dari itu. Urutan melarikan diri \e[0;31mmisalnya, akan terhisap oleh terminal, yang pada gilirannya mengubah teks berikut menjadi merah, tetapi bash tidak tahu itu. Jadi, Anda harus memberi tahu bash bahwa urutan karakter tidak boleh dihitung dalam panjang prompt, dan Anda melakukannya dengan menyertakannya \[ \]. Saya juga merekomendasikan menggunakan tput sebagai ganti urutan escape terminal hardcoding.

red=$(tput setaf 1)
reset=$(tput sgr0)
PS1='\[$red\][\W]\$\[$reset\] '

Lihat BashFAQ 53 dan kode Terminal (ANSI / VT100) untuk lebih lanjut.

geirha
sumber
1
Terima kasih atas deskripsi Anda yang sempurna, saya mengalami masalah ini beberapa kali dan tidak pernah tahu di mana masalahnya.
Betlista
+1, sama di sini. Bagi mereka yang secara buta menguji solusi ini dan itu tidak berhasil, ada baiknya menyebutkan di sini bahwa ada sintaks lain yang dijelaskan dalam tautan BashFAQ untuk melarikan diri warna dalam fungsi \001 \002,.
Stephen Niedzielski