configuration bash PS1

9

J'essaie de configurer PS1 comme suit.

Vert = "\ [\ e [32; 1m \]"
Rouge = "\ e [0; 31m"
Violet = "\ e [0; 35m"
STARTCOLOR = "\ [\ e [40m \]"
ENDCOLOR = "\ [\ e [0m \]"
export PS1 = "$ STARTCOLOR $ Green \ u @ $ Purple \ h $ Red \ w $ Green> $ ENDCOLOR"

Et j'ai quelques questions.

  • Quelle est la différence entre "[\ e [32; 1m]" et \ e [32; 1m "? Sont-ils les mêmes?
  • Après avoir exécuté la commande 'export PS1', cela fonctionne bien, mais quand je donne l'entrée environ 20 caractères, les caractères sont remplacés comme je les ai joints. Quel est le problème avec ça?
  • Quelle est la signification de STARTCOLOR (\ e [40m) / ENDCOLOR (\ e [0m)?

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

AJOUTÉE

Après quelques tests, j'ai obtenu le changement suivant qui pourrait résoudre le problème. Autrement dit, le format "\ e" doit être remplacé par le format "\ [\ e".

Rouge = "\\ e [1; 31m" - ne fonctionne pas
Rouge = "\ [\ e [1; 31m \]" - fonctionne
prosseek
la source

Réponses:

12

J'ai une fonction d'aide pour définir l'invite, et parce que je ne veux pas passer plus de temps à rechercher des références de code d'échappement, j'ai codé toutes les valeurs de couleur du texte.

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

Vous pouvez alors faire:

PS1=$( set_prompt )

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

unset -f set_prompt

Voici le lien qui explique les codes du terminal VT100: http://www.termsys.demon.co.uk/vtansi.htm

\[- commencer la séquence de caractères non imprimables
\]- terminer la séquence de caractères non imprimables

  • Quelle est la différence entre "[\ e [32; 1m]" et \ e [32; 1m "? Sont-ils les mêmes?

Pas la même chose, et il devrait être \[\e[32;1m\]'. Without[] `il essaierait d'imprimer la séquence dans la console.

  • Quelle est la signification de STARTCOLOR (\ e [40m) / ENDCOLOR (\ e [0m)?

STARTCOLOR, signifie définir l'arrière-plan sur noir, ENDCOLOR signifie réinitialiser tous les attributs de texte, ce qui signifie «donnez-moi la couleur par défaut de la console»

Alexander Pogrebnyak
la source
+1 Très sympa !!! Ça ne me dérange pas que je copie ceci dans mon bashrc :)
Eldelshell
@Ubersoldat. Pas du tout.
Alexander Pogrebnyak, le
1
Utilisez \$pour basculer automatiquement entre l'indication racine et non racine.
pause jusqu'à nouvel ordre.
9

Du manuel bash:

\[    commencer une séquence de caractères non imprimables, qui pourrait être utilisée pour incorporer une séquence de contrôle de terminal dans l'invite
\]    terminer une séquence de caractères non imprimables

\[et \]ne sont pas transmises au terminal. Ils disent à bash que les caractères entre eux ne seront pas imprimés. Sans eux, bash ne pouvait pas savoir que la séquence suivant le caractère d'échappement (par exemple [32;1m) ne prend pas de place à l'écran, ce qui explique pourquoi elle n'a pas calculé correctement la longueur de l'invite lorsque vous les avez laissés de côté.

Notez que vous n'avez pas été très cohérent dans votre question (ou peut-être que c'est juste une erreur avec Markdown); vous devez avoir une séquence littérale de parenthèse antislash $PS1, pas seulement une parenthèse (qui serait affichée littéralement).

Les séquences d'échappement commençant par \esont interprétées par l'émulateur de terminal. Ils sont documentés dans le document des séquences de contrôle Xterm (ctlseqs) (les autres émulateurs de terminaux sont généralement compatibles). Par exemple, \e[32;1mpasse au premier plan gras et vert; \e[40mfait passer la couleur d'arrière-plan au noir; \e[0mrestaure les attributs par défaut.

Gilles 'SO- arrête d'être méchant'
la source
3

La plupart des émulateurs de terminaux modernes peuvent utiliser des codes d'échappement ANSI pour contrôler divers aspects de l'affichage.

La plupart des codes ANSI commencent par le code à 2 caractères ESC- [C'est le caractère d'échappement (ASCII décimal 27) suivi du caractère de crochet ouvert. Cette séquence est également connue sous le nom de CSI ou Control Sequence Initiator.

Parce que le caractère d'échappement n'est pas un caractère que vous pouvez saisir directement (la touche Échap a d'autres utilisations, souvent spécifiques à l'application), bash utilise '\ e' pour s'y référer.

La modification de la couleur du texte utilise la commande ANSI Set Graphics Mode:

\e[<value>m

<value>peut être une liste de valeurs séparées par des points-virgules ( ;). Normalement, une seule valeur est utilisée, bien que l'attribut gras soit utile conjointement avec les attributs de couleur.

En regardant les valeurs répertoriées dans la réponse d'Alexander Pogrebnyak, le 0 ou 1 avant le point-virgule sélectionne gras ou non:

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

Il y a une liste utile des codes ici http://ascii-table.com/ansi-escape-sequences.php

dr-jan
la source