Prompt berwarna dalam KornShell

11

Menurut posting StackOverflow ini , dimungkinkan memiliki prompt berwarna di KornShell. Saya belum bisa menemukan cara untuk melakukan ini. Saya dapat menggunakan warna:

echo -e "\033[34mLinux\033[00m"

memberikan output "Linux" biru, seperti halnya:

printf "\033[34mLinux\033[00m"

Namun, ketika saya memasukkan kode pelarian ke dalam PS1variabel prompt saya , mereka tidak lolos. Apa yang harus saya lakukan untuk mendapatkan prompt berwarna? Selain menjadi pengisap untuk eyecandy, saya menemukan bahwa prompt berwarna berguna saat mengurai output secara visual.

Kazark
sumber

Jawaban:

10

Cukup gunakan karakter Esc literal, dimasukkan dengan Ctrl- v, Esc(akan ditampilkan seperti ^[pada layar):

PS1="^[[34mLinux^[[00m"

Atau gunakan output dari echoperintah yang Anda temukan berfungsi:

PS1="$(echo -e "\033[35mLinux\033[00m")"
manatwork
sumber
Pada saat-saat seperti inilah saya menyadari bahwa saya belum menjadi perintah baris noob. Saya biasanya merasa sangat baik dibandingkan dengan teman-teman saya. :) Versi pertama berfungsi dengan baik; trik yang sangat bagus! Saya tidak berhasil dengan versi kedua. +1
Kazark
5

Anda perlu memasukkan karakter escape literal ke dalam PS1variabel. Ksh88 dan klon seperti pdksh dan mksh (versi yang lebih lama) tidak memiliki sintaks literal untuk karakter kontrol kecuali melalui printbuilt-in. Mksh mengerti \euntuk melarikan diri, tetapi pdksh membutuhkan kode oktal \033.

PS1=$(print '\033[34mLinux\033[00m')

ATT ksh93 memperkenalkan sintaks literal backlash-escaped $'…'(juga tersedia di mksh sejak R39b). Anda dapat menggunakan lolos backslash untuk menempatkan karakter kontrol dalam literal ini.

PS1=$'\e[34mLinux\e[00m'
Gilles 'SANGAT berhenti menjadi jahat'
sumber
2
Sebenarnya, mkshjuga mendukung $'…'- diakui karena Dave Korn (Korn di Korn Shell) bersikeras saya menambahkannya.
mirabilos
@mirabilos Ah, terima kasih. Saya mungkin mengetik jawaban itu di mesin dengan mksh R39 dan tidak memeriksa versi yang lebih baru.
Gilles 'SO- stop being evil'
2

Saya menggunakan ini mkshuntuk pengguna shell:

# custom prompt see http://comments.gmane.org/gmane.os.miros.mksh/126
PS1=$'\a\r\a\e[1;34m\a ^ ^  ^ ^ | \a\e[36m\a${USER:=$(ulimit -c 0; id -un 2>/dev/null || echo
\?)}@${HOSTNAME%%.*}\a\e[34m\a | ^ ^  ^ ^ | \a\e[0;33m\a$(local d=${PWD:-?} p=~; [[ $p = ?(*/) ]] || d=${d/#$p/~};
print -nr -- "$d")\a\e[1;34m\a |\n ^ ^  ^ ^ | \a\e[32m\a$(date +%H:%M)\a\e[34m\a | ^ ^ >>\a\e[0m\a '

& sedikit berbeda shelluntuk root:

PS1=$'\a\r\a\e[1;34m\a ^ ^  ^ ^  ^   \a\e[31m\a${USER:=$(ulimit -c 0; \
    id -un 2>/dev/null || echo \?)}@${HOSTNAME%%.*}\a\e[34m\a  ^ ^  ^ ^  ^ ^  ^   \a\e[0;33m\a$(
        local d=${PWD:-?} p=~
        [[ $p = ?(*/) ]] || d=${d/#$p/~}
        print -nr -- "$d"
)\a\e[1;34m\a  ^ ^ \n ^ ^  ^ ^  ^   \a\e[32m\a$(date +%H:%M)\a\e[34m\a  ^ ^  ^ ^   \a\e[0m\a '

masukkan deskripsi gambar di sini

Karena karakter khusus tidak menyalin, berikut adalah pasta pastebin untuk pengguna normal dan root.

Stuart Cardall
sumber
1

Beberapa hal sedang terjadi dalam jawaban orang, masing-masing melibatkan sintaks yang berbeda.

  1. Urutan pelarian untuk program terminal Anda yang diberikan dalam dokumentasi.

  2. Cara menyandikan urutan pelarian terminal dalam variabel PS1, misalnya \ e atau literal escape. Ini tergantung pada shell.

  3. Bagaimana cara menambahkan informasi yang berubah ke prompt, misalnya nama host, direktori saat ini, dll. Ini juga tergantung pada shell. Anda mungkin dapat menggunakan urutan garis miring terbalik khusus seperti \ w untuk direktori kerja, atau Anda mungkin harus menyebutkan variabel lingkungan atau menanamkan baris perintah ke dalam string.

  4. Bagaimana cara memberi tahu shell karakter yang dicetak dan karakter mana yang tidak. Shell tidak tahu di mana urutan pelarian terminal Anda mulai dan berakhir. Jika shell memiliki editor baris perintah atau yang serupa, shell perlu tahu karakter mana yang dicetak sehingga tahu di mana kursor berada. Tanpa detail ini, prompt Anda mungkin terlihat benar tetapi mengedit dapat berperilaku aneh.

    • Di bash, Anda menaruh \ [sebelum setiap urutan escape dan \] setelah.

    • Di ksh, Anda memilih satu karakter ASCII yang tidak tercetak yang tidak dapat muncul di string lain. Di awal string, Anda menulis karakter yang diikuti oleh carriage return ASCII. Kemudian Anda menulis karakter yang sama sebelum dan sesudah setiap urutan pelarian. z3ntu memilih \ a sebagai karakter marker.

Derek Peschel
sumber
0

Berkat jawaban sebelumnya dan sumber lain, saya dapat menemukan ini:

Korn shell prompt:

PS1="$(echo "\033[32m`logname`\033[35m@\033[32m`hostname` \033[33m`pwd`\033[36m\n\$\033[0m")"

Bash prompt:

PS1="\[\e[32m\]\u\[\e[35m\]@\[\e[32m\]\h \[\e[33m\]\w\[\e[36m\]\n\$\[\e[0m\]"

Ini memberikan prompt berwarna yang sama (ya, saya berbicara bahasa Inggris Ratu;)) dalam format:

username@computername /current/working/directory
$

Setara DOS (meskipun tidak ada pilihan warna) adalah:

prompt %username%@%computername% $P$_$G

pemberian yang mana:

username@computername /current/working/directory
>

">" Menyimpannya 'DOSSY' daripada 'nixy' dengan "$", tetapi jika Anda menginginkan sigil ("$"), maka itu adalah:

prompt %username%@%computername% $P$_$$

Asalkan akun login Anda memiliki izin yang diperlukan, untuk membuat 'nixies' secara permanen menambahkannya dengan "ekspor":

export PS1="..."

dan ubah DOSSY menjadi:

setx PROMPT "%username%@%computername% $P$_$G"

atau

setx PROMPT "%username%@%computername% $P$_$$"
skeetastax
sumber