web-dev-qa-db-fra.com

Correction des erreurs de lignes lors de la tentative de coloration du terminal PS1 (même lors de l'échappement de caractères non imprimables)

Comme je travaille depuis trop longtemps sans brancher mon ordinateur portable, j'essaie d'écrire une nouvelle PS1 qui indique l'état actuel de ma batterie à l'aide d'Upower. J'y suis presque, tout fonctionne bien sauf ce petit problème (gênant) de couleur et d'habillage (ou plus précisément, l'absence de caractères, c'est-à-dire que les caractères sont imprimés au début de la même ligne lorsque la fin de la fenêtre est remplie/pas de nouvelle ligne). Au début, je pensais avoir commis une erreur (comme tous les précédents articles que j'ai vus jusqu'à présent) et j'ai oublié d'échapper aux caractères non imprimables (avec \[\] ) mais je ne vois pas où ... Sinon, existe-t-il un problème connu concernant l'imbrication d'alias et de fonctions dans PS1 (ou quelqu'un a-t-il une meilleure idée de faire ce que j'essaie de faire? ?)?

Voici ma PS1 (la partie "si le terme est coloré"):

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\](`battPer`)-\A:\[\033[01;34m\]\w\[\033[00m\]\$ '

Et la fonction batPer (et alias) dans mes aliases .bash (commentaires ci-dessous):

batPer()
{
 percent=`upower -i /org/freedesktop/UPower/devices/battery_BAT1 | grep -E percentage | cut -d : -f 2 | cut -d " " -f 11 | cut -d % -f 1`
 plugged=`upower -i /org/freedesktop/UPower/devices/line_power_ACAD | grep -E "online: " | cut -d y -f 2` 

if [ "$plugged" = 'es' ] ; then
    echo -e "\[\e[0;92m\]$percent%\[\e[0m\]"
else
  if [ "$percent" -le 10 ]  ; then
     echo -e "\[\e[0;91m\]$percent%"
  else 
     echo -e "\[\e[0m\]$percent%" 
  fi
fi
 }
alias battPer='batPer'

(Je prends la valeur de line_power_ACAD car son statut change dès que je (débranche) mon ordinateur portable - je prends "y" du "oui" comme -f pour ma coupe et teste donc "es" parce que. .. eeerrr ... je suis fainéant;) - puis je teste: branché -> valeur en vert, pas branché: <10% tout le caractère en rouge,> 10% réinitialiser couleur/blanc. Je fais le pseudo à la fin parce que j'avais un problème en essayant de mettre la fonction elle-même dans PS1).

Merci les gars pour m'avoir sauvé de longues nuits de cauchemars colorés, désolé s'il y a une grosse erreur au milieu de mon bordel, j'ai trop regardé ces lignes ...

Mise à jour: Désolé, j'ai oublié de source .bashrc après le dernier mod, je me perds encore plus quand \[\e[0;92m\]$percent%\[\e[0m\] le résultat est: output1 et quand je ne mets pas les caractères d’échappement, c’est bon (pourcentage en vert) - toujours pas d’emballage ... Je suis-je en train d’échapper les caractères d’échappement quelque part?!?

4
Simon Van Machin

Le problème serait que (c'est moi qui souligne, de le manuel de bash ):

Une fois la chaîne décodée , elle est développée via le développement de paramètres, la substitution de commandes, le développement arithmétique et la suppression de devis, en fonction de la valeur de l'option shell Shell promptvars. (voir Bash Builtins ).

Ainsi, le \[ de votre sortie de fonction arrive trop tard pour indiquer à Bash que les codes de contrôle suivent. Vous devez définir PS1 avec le résultat de la fonction incluse pour que cela fonctionne. Je suggérerais d'utiliser Prompt_COMMAND ainsi:

Prompt_COMMAND='PS1="${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\](`batPer`)-\A:\[\033[01;34m\]\w\[\033[00m\]\$ "'

Notez que les guillemets internes sont des guillemets. Ainsi, chaque fois que PS1 est défini, la sortie est ajoutée à celle-ci et , puis Bash décode PS1 pour afficher l'invite.

Note latérale: avec cela, vous n'avez pas besoin de echo -e la sortie. Avant, vous en aviez besoin pour la couleur, car Bash ne l'interprétait pas après avoir développé la chaîne PS1. Désormais, Bash décodera également les codes de contrôle.

3
muru