Invite colorée dans KornShell


11

Selon ce post StackOverflow , il est possible d'avoir une invite colorée dans KornShell. Je n'ai pas pu comprendre comment procéder. Je peux utiliser la couleur:

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

donne une sortie "Linux" bleue, tout comme:

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

Cependant, lorsque j'incorpore les codes d'échappement dans ma PS1variable d'invite, ils ne sont pas échappés. Que dois-je faire pour obtenir une invite colorée? En plus d'être un truc pour les yeux, je trouve qu'une invite colorée est utile lors de l'analyse visuelle de la sortie.

Réponses:


10

Utilisez simplement un caractère Esc littéral, entré avec Ctrl- v, Esc(sera affiché comme ^[sur l'écran):

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

Ou utilisez la sortie de la echocommande qui fonctionne:

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

C'est à des moments comme celui-ci que je me rends compte que je suis encore un noob en ligne de commande. Je me sens généralement si bien par rapport à mes amis. :) La première version a bien fonctionné; quel bon tour! Je n'ai pas réussi avec la deuxième version. +1
Kazark

5

Vous devez mettre un caractère d'échappement littéral dans la PS1variable. Ksh88 et les clones tels que pdksh et mksh (anciennes versions) n'ont pas de syntaxe littérale pour les caractères de contrôle, sauf via le printintégré. Mksh comprend \epour échapper, mais pdksh nécessite le code octal \033.

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

ATT ksh93 introduit la syntaxe littérale échappée à jeu inversé $'…'(également disponible dans mksh depuis R39b). Vous pouvez utiliser des échappements antislash pour placer des caractères de contrôle dans ces littéraux.

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

2
En fait, mkshsoutient également $'…'- certes parce que Dave Korn (le Korn dans Korn Shell) a insisté pour que je l'ajoute.
mirabilos

@mirabilos Ah, merci. J'ai probablement tapé cette réponse sur une machine avec mksh R39 et je n'ai pas vérifié les versions plus récentes.
Gilles 'SO- arrête d'être méchant'

2

Je les utilise mkshpour un utilisateur 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 '

& un peu différent shellpour 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 '

entrez la description de l'image ici

Comme les caractères spéciaux n'ont pas été copiés, voici une pâte à coller pour l'utilisateur normal et root.


1

Plusieurs choses se passent dans les réponses des gens, chacune impliquant une syntaxe différente.

  1. Les séquences d'échappement de votre programme terminal données dans la documentation.

  2. Comment coder les séquences d'échappement terminales dans la variable PS1, par exemple \ e ou littéral d'échappement. Cela dépend du shell.

  3. Comment ajouter des informations changeantes à l'invite, par exemple le nom d'hôte, le répertoire courant, etc. Cela dépend également du shell. Vous pourrez peut-être utiliser des séquences antislash spéciales comme \ w pour le répertoire de travail, ou vous devrez peut-être nommer des variables d'environnement ou incorporer des lignes de commande dans la chaîne.

  4. Comment dire au shell quels caractères s'impriment et quels caractères ne le font pas. Le shell ne sait pas où commencent et finissent vos séquences d'échappement terminales. Si le shell a un éditeur de ligne de commande ou quelque chose de similaire, il doit savoir quels caractères imprimer pour savoir où se trouve le curseur. Sans ce détail, votre invite pourrait sembler correcte, mais l'édition peut se comporter étrangement.

    • En bash, vous mettez \ [avant chaque séquence d'échappement et \] après.

    • Dans ksh, vous choisissez un seul caractère ASCII non imprimable qui ne peut apparaître nulle part ailleurs dans la chaîne. Au début de la chaîne, vous écrivez ce caractère suivi d'un retour chariot ASCII. Ensuite, vous écrivez le même caractère avant et après chaque séquence d'échappement. z3ntu a choisi \ a comme caractère marqueur.


0

Grâce aux réponses précédentes et à d'autres sources, j'ai pu trouver celles-ci:

Invite du shell Korn:

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

Invite bash:

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

Ceux-ci donnent la même invite de couleur (oui, je parle l'anglais de la Reine;)) au format:

username@computername /current/working/directory
$

L'équivalent DOS (bien qu'il n'y ait pas d'options de couleur) est:

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

qui donne:

username@computername /current/working/directory
>

Le ">" le garde 'DOSsy' plutôt que 'nixy' avec "$", mais si vous vouliez le sigil ("$") à la place, ce serait:

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

À condition que votre compte de connexion dispose des autorisations nécessaires, pour rendre les «nixies» permanents, ajoutez-les à «exporter»:

export PS1="..."

et changez le DOSsy en:

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

ou

setx PROMPT "%username%@%computername% $P$_$$"
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.