Prompt colorato in KornShell


11

Secondo questo post StackOverflow , è possibile avere un prompt colorato in KornShell. Non sono stato in grado di capire come farlo. Sono in grado di usare il colore:

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

fornisce un output "Linux" blu, così come:

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

Tuttavia, quando incorporo i codici di escape nella mia PS1variabile prompt, non vengono salvati. Cosa devo fare per ottenere un prompt colorato? Oltre ad essere una sorta di ventosa per eyecandy, trovo che un prompt colorato sia utile quando analizza visivamente l'output.

Risposte:


10

Basta usare un carattere Esc letterale, inserito con Ctrl- v, Esc(verrà visualizzato come ^[sullo schermo):

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

Oppure usa l'output del echocomando che scopri che sta funzionando:

PS1="$(echo -e "\033[35mLinux\033[00m")"

È a volte come questo che mi rendo conto di essere ancora un punto di comando. Di solito mi sento così bene rispetto ai miei amici. :) La prima versione ha funzionato bene; che bel trucco! Non ho avuto successo con la seconda versione. +1
Kazark,

5

Devi inserire un carattere di escape letterale nella PS1variabile. Ksh88 e cloni come pdksh e mksh (versioni precedenti) non hanno una sintassi letterale per i caratteri di controllo se non attraverso il printbuilt-in. Mksh comprende la \efuga, ma pdksh richiede il codice ottale \033.

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

ATT ksh93 introduce la sintassi letterale con escape del gioco $'…'(disponibile anche in mksh da R39b). È possibile utilizzare le barre rovesciate per inserire i caratteri di controllo in questi valori letterali.

PS1=$'\e[34mLinux\e[00m'

2
In realtà, mkshsupporta anche $'…'- certamente perché Dave Korn (il Korn in Korn Shell) ha insistito per aggiungerlo.
mirabilos,

@mirabilos Ah, grazie. Probabilmente ho scritto quella risposta su una macchina con mksh R39 e non ho controllato le versioni più recenti.
Gilles 'SO- smetti di essere malvagio' il

2

Li uso mkshper un utente 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 '

e leggermente diverso shellper 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 '

inserisci qui la descrizione dell'immagine

Poiché i caratteri speciali non sono stati copiati, ecco una pasta pastebin sia per l'utente normale che per il root.


1

Molte cose stanno succedendo nelle risposte delle persone, ognuna con una sintassi diversa.

  1. Le sequenze di escape per il programma terminale fornite nella documentazione.

  2. Come codificare le sequenze di escape del terminale nella variabile PS1, ad esempio \ eo escape letterale. Questo dipende dalla shell.

  3. Come aggiungere informazioni di modifica al prompt, ad esempio il nome host, la directory corrente, ecc. Questo dipende anche dalla shell. Potrebbe essere possibile utilizzare sequenze di barre rovesciate speciali come \ w per la directory di lavoro oppure potrebbe essere necessario assegnare un nome alle variabili di ambiente o incorporare le righe di comando nella stringa.

  4. Come dire alla shell quali caratteri stampare e quali personaggi no. La shell non sa dove iniziano e finiscono le sequenze di escape del terminale. Se la shell ha un editor da riga di comando o qualcosa di simile, deve sapere quali caratteri stampare in modo da sapere dove si trova il cursore. Senza questo dettaglio, la richiesta potrebbe apparire corretta ma la modifica può comportarsi in modo strano.

    • In bash, metti \ [prima di ogni sequenza di escape e \] dopo.

    • In ksh, scegli un singolo carattere ASCII non stampabile che non può apparire in nessun altro punto della stringa. All'inizio della stringa, scrivi quel carattere seguito da un ritorno a capo ASCII. Quindi scrivi lo stesso carattere prima e dopo ogni sequenza di escape. z3ntu ha scelto \ a come carattere marcatore.


0

Grazie alle risposte precedenti e ad altre fonti, sono stato in grado di trovare questi:

Prompt della shell Korn:

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

Richiesta Bash:

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

Questi danno lo stesso prompt di colore (sì, parlo inglese della regina;)) nel formato:

username@computername /current/working/directory
$

L'equivalente DOS (anche se non ci sono opzioni di colore) è:

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

che dà:

username@computername /current/working/directory
>

">" Lo mantiene "DOSsy" anziché "nixy" con "$", ma se si volesse invece il sigillo ("$"), sarebbe:

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

A condizione che il proprio account di accesso disponga delle autorizzazioni necessarie, per rendere permanenti i "nixies" anteporre "esportazione":

export PS1="..."

e modifica il DOSsy in:

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

o

setx PROMPT "%username%@%computername% $P$_$$"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.