pengaturan bash PS1

9

Saya mencoba membuat PS1 dikonfigurasi sebagai berikut.

Hijau = "\ [\ e [32; 1m \]"
Merah = "\ e [0; 31m"
Ungu = "\ e [0; 35m"
STARTCOLOR = "\ [\ e [40m \]"
ENDCOLOR = "\ [\ e [0m \]"
ekspor PS1 = "$ STARTCOLOR $ Hijau \ u @ $ Ungu \ h $ Merah \ w $ Hijau> $ ENDCOLOR"

Dan saya punya beberapa pertanyaan.

  • Apa perbedaan antara "[\ e [32; 1m]" dan \ e [32; 1m "? Apakah keduanya sama?
  • Setelah menjalankan perintah 'ekspor PS1', berfungsi dengan baik, tetapi ketika saya memberi input sekitar 20 karakter, karakter-karakter tersebut ditimpa saat saya lampirkan. Ada apa dengan ini?
  • Apa arti dari STARTCOLOR (\ e [40m) / ENDCOLOR (\ e [0m)?

http://a.imageshack.us/img8/606/resultqm.jpg

TAMBAH

Setelah beberapa tes, saya mendapat perubahan berikut bisa menyelesaikan masalah. Artinya, format "\ e" harus diganti dengan format "\ [\ e".

Merah = "\\ e [1; 31m" - tidak berfungsi
Merah = "\ [\ e [1; 31m \]" - berfungsi
prosseek
sumber

Jawaban:

12

Saya memiliki fungsi pembantu untuk mengatur prompt, dan karena saya tidak ingin menghabiskan lebih banyak waktu untuk mencari referensi kode pelarian, saya telah mengkodekan semua nilai warna teks ke dalamnya.

function set_prompt ( )
{
    # Prompt setup
    # ##################

    # Black            \e[0;30m
    # Blue             \e[0;34m
    # Green            \e[0;32m
    # Cyan             \e[0;36m
    # Red              \e[0;31m
    # Purple           \e[0;35m
    # Brown            \e[0;33m
    # Gray             \e[0;37m
    # Dark Gray        \e[1;30m
    # Light Blue       \e[1;34m
    # Light Green      \e[1;32m
    # Light Cyan       \e[1;36m
    # Light Red        \e[1;31m
    # Light Purple     \e[1;35m
    # Yellow           \e[1;33m
    # White            \e[1;37m

    local COLOR_DEFAULT='\[\e[0m\]'
    local COLOR_BLACK='\[\e[0;30m\]'
    local COLOR_BLUE='\[\e[0;34m\]'
    local COLOR_GREEN='\[\e[0;32m\]'
    local COLOR_CYAN='\[\e[0;36m\]'
    local COLOR_RED='\[\e[0;31m\]'
    local COLOR_PURPLE='\[\e[0;35m\]'
    local COLOR_BROWN='\[\e[0;33m\]'
    local COLOR_GRAY='\[\e[0;37m\]'
    local COLOR_DARK_GRAY='\[\e[1;30m\]'
    local COLOR_L_BLUE='\[\e[1;34m\]'
    local COLOR_L_GREEN='\[\e[1;32m\]'
    local COLOR_L_CYAN='\[\e[1;36m\]'
    local COLOR_L_RED='\[\e[1;31m\]'
    local COLOR_L_PURPLE='\[\e[1;35m\]'
    local COLOR_YELLOW='\[\e[1;33m\]'
    local COLOR_WHITE='\[\e[1;37m\]'

    local PS1_SET_TITLE='\[\e]0;\w\a\]'

    local PS1_SET_TIME="${COLOR_DEFAULT}\t"
    local PS1_SET_RET_CODE="${COLOR_L_RED}(\$?)"
    local PS1_SET_USER="${COLOR_L_GREEN}\u@\h"
    local PS1_SET_PWD="${COLOR_YELLOW}\w"

    local PS1_LN_1="${PS1_SET_TITLE}\n"
    local PS1_LN_2="${PS1_SET_TIME} ${PS1_SET_RET_CODE} "
    local PS1_LN_2="${PS1_LN_2}${PS1_SET_USER} ${PS1_SET_PWD} ${COLOR_DEFAULT}\n"

    echo "${PS1_LN_1}${PS1_LN_2}"
}

Anda kemudian dapat melakukan:

PS1=$( set_prompt )

# Use '#' for root shell
export PS1=${PS1}'$ '

unset -f set_prompt

Berikut ini tautan yang menjelaskan kode terminal VT100: http://www.termsys.demon.co.uk/vtansi.htm

\[- mulai urutan karakter yang tidak dicetak
\]- urutan akhir karakter yang tidak dicetak

  • Apa perbedaan antara "[\ e [32; 1m]" dan \ e [32; 1m "? Apakah keduanya sama?

Tidak sama, dan seharusnya \[\e[32;1m\]'. Without[] `akan mencoba mencetak urutan di konsol.

  • Apa arti dari STARTCOLOR (\ e [40m) / ENDCOLOR (\ e [0m)?

STARTCOLOR, berarti mengatur latar belakang menjadi hitam, ENDCOLOR berarti mengatur ulang semua atribut teks, yang berarti 'beri saya warna konsol default'

Alexander Pogrebnyak
sumber
+1 Sangat bagus !!! Jangan pedulikan saya salin ini ke bashrc saya :)
Eldelshell
@Ubersoldat. Tidak semuanya.
Alexander Pogrebnyak
1
Gunakan \$untuk secara otomatis beralih antara indikasi root dan non-root.
Dijeda sampai pemberitahuan lebih lanjut.
9

Dari manual bash:

\[    mulai urutan karakter non-cetak, yang dapat digunakan untuk menanamkan urutan kontrol terminal ke prompt
\]    mengakhiri urutan karakter non-cetak

\[dan \]tidak dilewatkan ke terminal. Mereka mengatakan kepada bash bahwa karakter di antara mereka tidak akan dicetak. Tanpa mereka, bash tidak dapat mengetahui bahwa urutan yang mengikuti karakter pelarian (e, g. [32;1m) Tidak memakan ruang di layar, yang menjelaskan mengapa ia tidak menghitung panjang prompt dengan benar ketika Anda meninggalkannya.

Perhatikan bahwa Anda belum sangat konsisten dalam pertanyaan Anda (atau mungkin itu hanya kesalahan dengan Penurunan harga); Anda harus memiliki urutan braket backslash-literal $PS1, bukan hanya braket (yang akan ditampilkan secara harfiah).

Urutan escape yang dimulai dengan \editafsirkan oleh terminal emulator. Mereka didokumentasikan dalam dokumen sekuens kontrol Xterm (ctlseqs) (emulator terminal lain cenderung sebagian besar kompatibel). Misalnya, \e[32;1mberalih ke latar depan tebal dan hijau; \e[40mmengganti warna latar menjadi hitam; \e[0mmengembalikan atribut default.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
3

Kebanyakan emulator terminal modern dapat menggunakan kode pelarian ANSI untuk mengontrol berbagai aspek tampilan.

Sebagian besar kode ANSI dimulai dengan kode 2 karakter ESC- [Itu adalah karakter pelarian (ASCII desimal 27) diikuti oleh karakter braket kotak terbuka. Urutan ini juga dikenal sebagai CSI atau Kontrol Sequence Initiator.

Karena karakter escape bukan karakter yang dapat Anda ketik secara langsung (tombol Esc memiliki yang lain, seringkali aplikasi spesifik, penggunaan) bash menggunakan '\ e' untuk merujuknya.

Mengubah warna teks menggunakan perintah ANSI Set Graphics Mode:

\e[<value>m

di mana <value>bisa menjadi daftar nilai yang dipisahkan oleh semi-titik dua ( ;). Biasanya hanya satu nilai yang digunakan, meskipun atribut tebal berguna dalam hubungannya dengan atribut warna.

Melihat nilai-nilai yang tercantum dalam jawaban Alexander Pogrebnyak, 0 atau 1 sebelum semi-kolon memilih dengan huruf tebal atau tidak:

\e[1m  # bold
\e[5m  # blink
\e[0m  # all attributes off

Ada daftar kode yang bermanfaat di sini http://ascii-table.com/ansi-escape-afterences.php

dr-jan
sumber