Coloration syntaxique bash [résolu au fil de l'eau]

Bonjour

Pour coloriser le prompt ‹ # › je suis ce tuto Tutoriel : Personnalisez votre shell en couleur !
Un imprévu, en ouvrant /etc/bash.bashrc, apparaît aux lignes correspondant à PS1 :

# set a fancy prompt (non-color, overwrite the one in /etc/profile)
# but only if not SUDOing and have SUDO_PS1 set; then assume smart user.
if ! [ -n "${SUDO_USER-}" -a -n "${SUDO_PS1-}" ]; then
  PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi

Pour colorer, je colle la nouvelle chaîne de caractères à la place de ‹ \u@\h:\w › et c’est tout ?

C’est la présence de ‹ debian_chroot . . . › qui me perturbe.

Bjr.

Ce sujet de la colorisation a déjà été abordé au fil du temps, et ce n’est pas la seule manière de faire :


ôte moi d’un doute ? modifies-tu directement le fichier /etc/bash.bashrc ?
parce que les modifications PS1 sont à faire dans ton ~/.bashrc personnel.

Quoiqu’il en soit, dans le fichier personnel, les tests pour la coloration des commandes sont déjà intégrées, et correctement en plus, tel que :

(…)
# set variable identifying the chroot you work in (used in the prompt below)
if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then
    debian_chroot=$(cat /etc/debian_chroot)
fi

# set a fancy prompt (non-color, unless we know we "want" color)
case "$TERM" in
    xterm-color|*-256color) color_prompt=yes;;
esac

# uncomment for a colored prompt, if the terminal has the capability; turned
# off by default to not distract the user: the focus in a terminal window
# should be on the output of commands, not on the prompt
#force_color_prompt=yes

if [ -n "$force_color_prompt" ]; then
    if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
    # We have color support; assume it's compliant with Ecma-48
    # (ISO/IEC-6429). (Lack of such support is extremely rare, and such
    # a case would tend to support setf rather than setaf.)
    color_prompt=yes
    else
    color_prompt=
    fi
fi

if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
unset color_prompt force_color_prompt

# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
    PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
    ;;
*)
    ;;
esac

# enable color support of ls and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
    test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
    alias ls='ls --color=auto'
    alias dir='dir --color=auto'
    alias vdir='vdir --color=auto'

    alias grep='grep --color=auto'
    alias fgrep='fgrep --color=auto'
    alias egrep='egrep --color=auto'
fi

# colored GCC warnings and errors
export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'

(…)

En fait dans ce fichier personnel, des tests sont implémentés pour détecter si le terminal est capable d’afficher des couleurs et de coloriser non seulement des variables d’environnement tel PS1, mais aussi d’autres sorties « écran ».

personnellement, je ne te recommanderais même pas de toucher le fichier personnel .bashrc, mais de faire ces modifications dans un fichier secondaire qui est normalement appelée et qui se trouve être ~/.bash_aliases ou tout autre fichier créé pour l’occasion, mais il te faudra le sourcer dans le .bashrc perso.

Ainsi pour les exports de variables, j’ai créé un fichier perso .export_var_env, qui est sourcé en fin de fichier ~/.bashrc où sont enregistrés toutes mes déclarations, tel que :

export LESSOPEN="| /usr/bin/source-highlight-esc.sh %s"
export LESS="-eFMRX"
# https://blog.shevarezo.fr/post/2018/01/25/comment-avoir-couleurs-pages-man-linux
export LESS_TERMCAP_mb=$'\e[1;31m'
export LESS_TERMCAP_md=$'\e[1;31m'
export LESS_TERMCAP_me=$'\e[0m'
export LESS_TERMCAP_se=$'\e[0m'
export LESS_TERMCAP_ue=$'\e[0m'
export LESS_TERMCAP_us=$'\e[1;32m'

if [ -x $(command -v batcat) ]; then
    export COLORTERM="truecolor"
    export MANPAGER="bat -p man"
fi

par exemple de mon .bash_aliases, j’ai entres autres les aliases suivants :

### GRC: Generic Colouriser
if [ -x /usr/bin/grc ]; then
    GRC_ALIASES=true
    [[ -s "/etc/profile.d/grc.sh" ]] && source /etc/profile.d/grc.sh
fi
alias ip="COLORFGBG=';1' ip -c"
if [ -x /usr/bin/prettyping ]; then
    alias ping="prettyping"
fi
alias dmesg="dmesg -HTL=always"

Voilà, c’était des exemples…
ceux concernant les sorties liées à l’utilisation des outils dmesg, ping sont intéressantes.


Maintenant, concernant l’utilisation de la variable ${debian_chroot}, je n’y avais jamais fait attention. Donc, non, tu ne touches pas à cette déclaration, en aucune manière.

À minima, tu fais tes modifications dans le fichier perso, normalement vierge, ~/.bash_aliases.
Le reste est pourtant bien expliqué dans l’article en question, surtout les aspects expliquant ce qu’est PS1, comment la créer/modifier avec tels symboles d’échappements.

Par contre, vu que dans le fichier perso .bashrc, les définitions de colorisation, telles

eval "`dircolors -b`"         #On active le support des couleurs si ce n'est pas encore fait :)
alias ls='ls --color=auto'    #On crée notre alias

sont déjà intégrées, et correctement ; donc il n’est pas nécessaire de les (re)définir !


Pour finir, oui tu peux modifier le fichier perso ~/.bashrc, mais avant, stp, penses à le sauvegarder au cas où tes modifications empêcheraient son bon fonctionnement ; si cela arrive, il te suffira de supprimer ton fichier modifié, puis de renommer le fichier sauvegardé ! :wink:

Merci pour ces explications.
Je retourne au tuto, et je le lis jusqu’au bout . . .

Bonjour

Effectivement faut tout lire et être concentré : ce que je voulais c’est uniquement colorer le prompt root en rouge.
J’ai repéché un tuto linuxtric Personnaliser le shell bash et ajouté ceci (en root avec su -) dans /root/.bashrc avec nano (qui a été mis à jour dans debian 13.5) →
PS1="\[\e[01;31m\]\u@\h:\w \$\[\e[0m\] "
évidemment $ en root ça fait désordre, alors je modifie en →
PS1="\[\e[01;31m\]\u@\h:\w \#\[\e[0m\] "
A la première connexion avec su - le prompt est ceci →
root@nietoperz:~ 1
je vérifie dans .bashrc et c’est bien un #
fermeture de nano sans rien modifier et voici qu’apparait le nouveau prompt →
root@nietoperz:~ 2
J’ai pas voulu tester jusqu’où il sait compter et remis le $

Mais c’est bien en rouge !

Pour juste le prompt root en rouge:

if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;31m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
unset color_prompt force_color_prompt

Dans .bashrc et c’est tout.

Merci, mais mon problème est simplement celui du caractère dièse remplacé par le caractère 1 … 2 …

Ce que tu cites est non adapté, selon un avis datant de 2020, que je cite →

Comme son chemin l’indique, le fichier ~/.bashrc est dans le répertoire personnel du compte utilisateur concerné.

Ce qui veut dire que le prompt du compte root est définit dans le fichier ~/.bashrc du compte root ( ~ désignant le répertoire personnel du compte utilisateur root )
et que le prompt d’un compte utilisateur non privilégié est définit dans le fichier ~/.bashrc ( ~ désignant le répertoire personnel du compte utilisateur concerné.)

Il y a donc deux fichiers distincts qui sont dans des répertoires distincts
et il est donc inutile d’utiliser un test dans ce fichier pour savoir
par quel compte utilisateur le fichier de configuration ~/.bashrc est lancé

Tu n’as pas bien lu, je ne teste pas la qualité du compte mais si le prompt en couleur est activé ou pas :

$color_prompt

En même temps, actuellement, et ce depuis déjà un temps certain, sous Debian :

  • quand c’est le prompt user, il est en couleur
  • quand tu es en session root, il est en noir & blanc

Donc quand tu as compris le propos, tu devrais comprendre sous quel session utilisateur tu es.
Donc, pourquoi pas modifié en rouge, mais est-ce vraiment nécessaire ?!

Ensuite, concernant la modification du ~/.bashrc pour le symbole ‹ # ›, c’est déjà le cas par défaut.


@Zargos

Normalement, du moins sous Debian, tu n’as même pas besoin de ce test… car l’équivalent est déjà implémenté dans le ~/.bashrc de l’utilisateur — pas pour root :wink:

Je n’aime pas le root en noir et blanc. Car sous certaines condition c’est pareil pour le user :slight_smile:
Comme ça je ne me pose pas la question, et comme j’ai standardisé mes installations, c’est partout de la même façon :smiley:

1 J'aime

Très utile.

La suite n’est pas importante (tant que c’est du rouge ça me va), juste pour comprendre.
Tant qu’on ne modifie pas /root/.bashrc on a bien un dièse.
Alors que mettre dedans pour que le dièse en reste un après modification pour avoir un prompt gras et rouge ?
Voilà la ligne PS1 pour rouge et gras en root :

PS1="[\e[01;31m]\u@\h:\w $[\e[00m] "

Cela affiche un dollar
Avec un dièse à la place du dollar, cela affiche un numéro d’ordre
Avec un espace ça affiche un . . . espace.
Voilà, ça m’embête de pas savoir :woozy_face:

Au cas où, le fichier /root/.bashrc intégral

     # ~/.bashrc: executed by bash(1) for non-login shells.
     # Note: PS1 is set in /etc/profile, and the default umask is defined
     # in /etc/login.defs. You should not need this unless you want different
     # defaults for root.
     # PS1='${debian_chroot:+($debian_chroot)}\h:\w\$ '
     # umask 022
     PS1="\[\e[01;31m\]\u@\h:\w \$\[\e[00m\] "
     # You may uncomment the following lines if you want `ls' to be colorized:
     # export LS_OPTIONS='--color=auto'
     # eval "$(dircolors)"
     # alias ls='ls $LS_OPTIONS'
     # alias ll='ls $LS_OPTIONS -l'
     # alias l='ls $LS_OPTIONS -lA'
     # Some more alias to avoid making mistakes:
     # alias rm='rm -i'
     # alias cp='cp -i'
     # alias mv='mv -i'

Oui car \# est un raccourci pour fournir le numéro de la commande dans l’historique … Attention à pas faire n’importe quoi et conserver une sauvegarde de tes fichiers avant chaque modification (afin de pouvoir revenir en arrière ne cas de problème).

Ta ligne corrigée ce serait plutôt ça :

PS1="\[\e[01;31m\]\u@\h:\w \$\[\e[00m\] "

En gros :

  • \[ et \] → encadrent les séquences de couleur invisibles
  • \e[01;31m → rouge gras
  • \u@\h:\w → utilisateur@host:répertoire
  • \$ → affiche # pour root, $ sinon
  • \e[00m → reset des couleurs

En règle générale j’aime bien personnaliser les prompt de root en rouge pour les machines de production, en mauve pour la préproduction et prompt vert pour les user non root … sur mon poste de travail j’ai aussi un shell personaliser avec une coloration syntaxtique en adéquation avec mon IDE.

1 J'aime

Ahhh, tiens !? J’ai un problème avec cette partie de règles : même sous root, il continue de m’afficher $ !


Et sinon, mon root actuel sous Debian :

#root@ptb-z:(6):~$ grep "^PS1" .bashrc
PS1="#\[\e[01;31m\]\u@\h:\[\e[00m\](\#):\[\e[0;31m\]\w\[\e[00m\]\$ "

C’est parce que tu as mis (#) que tu as toujours $
As-tu essayé sans? :wink:

Justement c là où tu te trompes, j’ai essayé d’abord sans le dieze devant !

1 J'aime

tu parles de celui du début ou de celui au milieu? :wink:

  • celui du début, dans un second temps, était \$ qui n’affichait pas le symbole logiquement attendu, puisqu’il ne l’affichait pas en fin ; donc remplacé, dans un troisième temps, par « figé dans le marbre » !
  • et celui du milieu m’affiche bien le nombre de commandes exécutées, entourés de parenthèses, ainsi que désiré
  • le \$ de fin ne change aucunement, et affiche seulement $ - au dire des indications de Clochette, cela devrait le faire !

rohhh les fôtes, pffff…

Attention à pas faire n’importe quoi . . .
:slightly_smiling_face: oui, j’ai sauvegardé le contenu du fichier d’origine

\$ → affiche # pour root, $ sinon
Ben non, chez moi ça reste toujours un $. Et c’est bien le fichier /root . . .

Merci

Sinon en fin de ligen, au lieu de \$ mettre \[# et là tu es sur d’avoir un # à la fin

~# PS1="\[\e[01;31m\]\u@\h:\[\e[00m\](\#):\[\e[0;31m\]\w\[\e[00m\]\[# "
root@mephisto:(22):~#

sinon au lieu de " utilise ' et là ça marche.

(22):~PS1='\[\033[01;31m\]\u@\h:\w\[\e[0;31m\]\[\033[00m\]\$ '
root@mephisto:~#

Faut faire attention entre les deux, l’un interprète pas l’autre :wink:

Donc avec des ', \$ est bien interprété comme le dit @Clochette

Sur ce je retourne à Death Stranding, j’ai des colis à livrer :slight_smile:


PS: @PengouinPdt , comment fais tu tes bas de notes dans tes comms?

Rohhh, le boulet, je me fais régulièrement avoir avec ce fichu détail, de l’utilisation de la simple quote vers double quote !
Bien vu :wink:

#root@ptb-z:(1):~# grep "^PS1" .bashrc
PS1='#\[\e[01;31m\]\u@\h:\[\e[00m\](\#):\[\e[3;31m\]\w\[\e[00m\]\$ '

Quant à mon user, j’ai fait mumuse avec ça :

user@machine-z: ~/Documents :$ grep 'PS1' ~/.export_var_env
13:export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]: \[\033[3;47;07;34m\]\w\[\033[00m\] :\$ '

---

:wink:


Explication : En fait, tu crées tout simplement l’équivalent de l’élément HTML : <hr>.

1 J'aime