bash configurazione PS1


9

Sto cercando di configurare PS1 come segue.

= Verdi "\ [\ e [32; 1 m \]"
Rosso = "\ e [0; 31m"
= Viola "\ e [0; 35m"
StartColor = "\ [\ e [40m \]"
EndColor = "\ [\ e [0m \]"
export PS1 = "$ STARTCOLOR $ Verde \ u @ $ Viola \ h $ Rosso \ w $ Verde> $ ENDCOLOR"

E ho alcune domande.

  • Qual è la differenza tra "[\ e [32; 1m]" e \ e [32; 1m "? Sono uguali?
  • Dopo aver eseguito il comando "Esporta PS1", funziona bene, ma quando do l'input di circa 20 caratteri, i caratteri vengono sovrascritti come ho allegato. Cosa c'è di sbagliato in questo?
  • Qual è il significato di STARTCOLOR (\ e [40m) / ENDCOLOR (\ e [0m)?

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

AGGIUNTO

Dopo alcuni test, ho ottenuto la seguente modifica che potrebbe risolvere il problema. Cioè, il formato "\ e" dovrebbe essere sostituito dal formato "\ [\ e".

Rosso = "\\ e [1; 31m" - non funzionante
Rosso = "\ [\ e [1; 31m \]" - funzionante

Risposte:


12

Ho una funzione di supporto per impostare prompt e, poiché non voglio dedicare più tempo alla ricerca di riferimenti a codici di escape, ho inserito tutti i valori dei colori del testo.

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}"
}

È quindi possibile fare:

PS1=$( set_prompt )

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

unset -f set_prompt

Ecco il link che spiega i codici terminali VT100: http://www.termsys.demon.co.uk/vtansi.htm

\[- inizia la sequenza di caratteri non stampabili
\]- termina la sequenza di caratteri non stampabili

  • Qual è la differenza tra "[\ e [32; 1m]" e \ e [32; 1m "? Sono uguali?

Non è lo stesso, e dovrebbe essere \[\e[32;1m\]'. Without[] `dovrebbe provare a stampare la sequenza in console.

  • Qual è il significato di STARTCOLOR (\ e [40m) / ENDCOLOR (\ e [0m)?

STARTCOLOR, significa impostare lo sfondo su nero, ENDCOLOR significa ripristinare tutti gli attributi del testo, che significa "dammi il colore predefinito della console"


+1 Molto bello !!! Non importa, lo copio sul mio bashrc :)
Eldelshell,

@Ubersoldat. Affatto.
Alexander Pogrebnyak,

1
Utilizzare \$per passare automaticamente dall'indicazione root a quella non root.
In pausa fino a ulteriore avviso.

9

Dal manuale di bash:

\[    iniziare una sequenza di caratteri non stampabili, che potrebbe essere utilizzata per incorporare una sequenza di controllo terminale nel prompt e
\]    una sequenza di caratteri non stampabili

\[e \]non vengono passati al terminale. Dicono a Bash che i personaggi tra loro non verranno stampati. Senza di essi, bash non potrebbe sapere che la sequenza che segue il carattere di escape (e, g. [32;1m) Non occupa spazio sullo schermo, il che spiega perché non ha calcolato correttamente la lunghezza del prompt quando li hai lasciati fuori.

Nota che non sei stato molto coerente con la tua domanda (o forse è solo un errore con Markdown); devi avere una sequenza letterale di parentesi quadre $PS1, non solo una parentesi (che verrebbe visualizzata letteralmente).

Le sequenze di escape che iniziano con \esono interpretate dall'emulatore di terminale. Sono documentati nel documento sulle sequenze di controllo Xterm (ctlseqs) (altri emulatori terminali tendono ad essere per lo più compatibili). Ad esempio, \e[32;1mpassa al primo piano in grassetto e verde; \e[40mcambia il colore di sfondo in nero; \e[0mripristina gli attributi predefiniti.


3

La maggior parte degli emulatori di terminali moderni è in grado di utilizzare i codici di escape ANSI per controllare vari aspetti del display.

La maggior parte dei codici ANSI inizia con il codice a 2 caratteri ESC- [Questo è il carattere di escape (ASCII decimale 27) seguito dal carattere parentesi quadra aperta. Questa sequenza è anche nota come CSI o Control Sequence Initiator.

Poiché il carattere di escape non è uno che puoi digitare direttamente (il tasto Esc ha altri usi, spesso specifici dell'applicazione) bash usa '\ e' per riferirsi ad esso.

La modifica del colore del testo utilizza il comando ANSI Set Graphics Mode:

\e[<value>m

dove <value>può essere un elenco di valori separati da punti e virgola ( ;). Normalmente viene utilizzato un solo valore, sebbene l'attributo grassetto sia utile insieme agli attributi color.

Guardando i valori elencati nella risposta di Alexander Pogrebnyak, lo 0 o 1 prima del punto e virgola seleziona grassetto o no:

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

C'è un utile elenco dei codici qui http://ascii-table.com/ansi-escape-sequences.php

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.