Tonin menunjukkan bug di prompt default saya . Contoh minimal:
Setel PS1:
PS1='$(exit_code=$?; [[ $exit_code -eq 0 ]] || printf %s $(tput setaf 1) $exit_code $(tput sgr0) " ")$ '
Pada titik ini, prompt terlihat seperti ini:
$
Sekarang picu output kode keluar dengan menjalankan:
false
Sekarang prompt berisi kode keluar berwarna merah di awal baris:
1 $
- Tekan Ctrl- r.
Ketik "false". Sekarang prompt hanya berisi pencarian:
(reverse-i-search)`false': false
- Tekan Enter.
Sejarah terminal yang dihasilkan sekarang berisi yang berikut:
1 $ch)`false': false
Output yang diharapkan:
1 $ false
Artinya, tampaknya hasil pencarian riwayat dicampur dengan prompt dan menyembunyikan perintah aktual yang dijalankan.
Saya mencoba mengatasinya dengan menggunakanPROMPT_COMMAND
:
set_exit_code() {
exit_code=$?
[[ $exit_code -eq 0 ]] || printf %s $(tput setaf 1) $exit_code $(tput sgr0) " "
}
set_bash_prompt() {
PS1='$(set_exit_code)$ ' # Double quotes give the same result
}
PROMPT_COMMAND=set_bash_prompt
Ini sepertinya tidak berfungsi - garis terlihat persis sama seperti sebelumnya setelah mencari dan menjalankan.
Bagaimana saya bisa memperbaikinya?
Jawaban:
Saya menemukan jawabannya di askubuntu.com . @qeirha menyebutkan bahwa Anda harus memberi tahu bash bahwa urutan karakter tidak boleh dihitung dalam panjang prompt, dan Anda melakukannya dengan menyertakannya
\[
\]
. Berdasarkan contoh yang diberikan, berikut adalah salah satu solusinya:sumber
PS1
kode lain , mengapa saya tidak melihatnya?(Maaf, tidak ada penjelasan di sini. Lihat Bagaimana menyesuaikan PS1 dengan benar? Atau pertanyaan lain tentang masalah perhitungan panjang cepat dan
\[
...\]
)sumber
\[...\]
berfungsi dengan baik selama Anda dapat menempatkan semua kode yang Anda ingin hasilkan dalam satu string. Namun, jika Anda ingin membagi kode menjadi fungsi-fungsi kecil, Anda sampai pada titik di mana Anda tidak dapat menempatkan tanda kurung mulai dan berakhir di string / fungsi yang sama. Dan itu melanggar garis bungkus. Kecuali jika Anda menggunakanPROMPT_COMMAND
untuk menghitung ulang AndaPS1
di setiap prompt.Memperluas jawaban @manatwork tetapi menjaga agar kode Anda tidak membelah
PS1
komputasi dalam fungsi yang berbeda, Anda dapat menulis prompt Anda dengan cara berikut:Kutipan ganda wajib saat mengatur
PS1
dan ketika menggunakanprintf
dalam fungsi.sumber
.bashrc
- jangan masukkan kode dalam file terpisah dan panggil itu.