{{tag>Bionic Xenial console terminal tutoriel tput_formater_le_texte_dans_le_terminal}} ---- ====== Tput, jouer avec le curseur et les couleurs dans le terminal ====== Tput est un utilitaire qui utilise la base de données terminfo pour modifier le paramétrage du terminal. Il permet d'initialiser ou réinitialiser le terminal. Tput peut notamment être utilisé pour déplacer le curseur à l'intérieur du terminal et ajouter un peu de décoration au texte (couleur, formatage). Il peut aussi permettre de personnaliser l'invite de commande. Ce tutoriel donne quelques pistes pour utiliser la couleur et déplacer le curseur à l'intérieur du terminal, avec et sans tput. ===== Pré-requis ===== Savoir un peu utiliser le terminal. ===== Méthode bien connue et un peu ésotérique des caractères d'échappement ANSI ===== La méthode semble-t-il la plus fréquemment rencontrée sur le web ne fait pas appel à tput mais à une succession de codes qui, pour efficaces qu'ils soient, rendent la lecture des scripts un peu difficile. Cette méthode nécessite de préfixer le texte à traiter par '\033[' (ou par '\e[' ou '\E['), le code '\033[0m' permettant de rétablir les paramètres par défaut. Exemples d'utilisation : echo -e "\033[31mUn texte en rouge,\033[0m la suite ne l'est plus" echo -e "Un texte en \e[32m\033[43mvert sur fond jaune\E[0m" echo -e "Et voici \033[31m\033[1m\033[4m\033[5m\033[7mun texte\033[0m mis en forme selon une forme particulièrement peu explicite." ==== Les codes couleur ==== Les codes numérotés 30 à 37 permettent de définir la couleur du texte (foreground), les codes 40 à 47 concernent l'arrière plan (background). Voici la liste de ces codes : ^ Code ^ Couleur ^ ^ | 30 et 40 | noir| | | 31 et 41 | rouge| | | 32 et 42 | vert| | | 33 et 43 | jaune| | | 34 et 44 | bleu| | | 35 et 45 | rose| | | 36 et 46 | cyan| | | 37 et 47 | gris| | ==== La décoration ==== Quelques éléments de formatage du texte peuvent également être définis. Ils sont activés par les codes suivants : ^ code ^ effet ^ | 1 | gras| | | 4 | soulignement | | | 5 | clignotant (ne fonctionne pas avec tous les terminaux) | | | 7 | surlignement | | ==== Retour au formatage par défaut : code 0 ==== Le retour aux valeurs de base est assuré par l'utilisation du code 0 ==== Utilisation de plusieurs codes successifs ==== Ainsi qu'il a été vu infra, il est possible d'appliquer plusieurs formatages au même texte. La méthode la plus simple consiste à se faire succéder les différents codes dans leur intégralité. Exemple d'un texte jaune, gras sur fond rouge, avec un mot passé en surligné : $ echo -e "Voici le \033[33m\033[1m\033[4m\033[41mle \033[7mtexte\033[0m mis en forme." Cette mise en forme peut se condenser ainsi, en séparant les formatages par un ';' : $ echo -e "Voici le \e[33;1;4;41mle \E[7mtexte\033[0m mis en forme selon la forme condensée." ==== Aide-mémoire des séquences d'échappement ==== Un script aide-mémoire est disponible sur le site www.admin-linux.fr dont vous trouverez ci-dessous une version un peu modifiée : #!/bin/bash function usage () { echo "Source : https://www.admin-linux.fr/bash-de-la-couleur-dans-le-shell/" echo "Ce script permet de visualiser les codes couleurs et quelques effets de décoration utilisables dans bash" exit 10 } if [[ "$1" == "-h" ]] || [[ "$1" == "-help" ]] || [[ "$1" == "--help" ]]; then usage ; fi # Texte de l'exemple ( >= 3 caractères ) : TEXT=" Bash " ; # Couleur du texte : declare -a FG=('' '1' '4' '5' '7' '30' '31' '32' \ '33' '34' '35' '36' '37') ; echo # Première ligne : printf "FG \ BG\t%${#TEXT}s" ; for bg in {40..47} ; do printf "%${#TEXT}s" "${bg} " ; done echo ; # Création du tableau de présentation des combinaisons : for fg in ${!FG[*]} ; do echo -ne "${FG[fg]}\t\033[${FG[fg]}m$TEXT" ; for bg in {40..47} ; do echo -ne "\033[${FG[fg]};${bg}m$TEXT\033[0m" ; done echo ; done # Comment déclarer une couleur : cat <<_eof_ FG = texte (foreground) \ BG = arrière-plan (background) Comment déclarer une couleur : ------------------------------ Format de déclaration : \\033[XXm où XX prend les valeurs de FG ou BG" ; Retour aux paramètres par défaut : \033[0m" ; Exemples : echo -e "\033[31mUn texte en rouge et\033[0m retour a la normale" echo -e "\033[34m\033[45mBleu sur fond rose\033[0m" peut aussi s'écrire : echo -e "\033[34;45mBleu sur fond rose\033[0m" echo -e "\033[34mbleu, \033[1mgras, \033[4msouligné, \033[5mclignotant \033[7met surligné\033[0m Pour plus de détails : http://www.admin-linux.fr/?p=9011 _eof_ ===== Méthode tput un peu plus ergonomique ===== L'utilisation de la commande tput appartenant au paquet ncurses permet d'utiliser une notation plus aidée à appréhender par l'utilisateur. Comment savoir si la librairie ncurses est installée sur mon système ? En général la librairie est installée par défaut. La commande dpkg -l permet de s'en assurer : $ dpkg -l *ncurses* Souhait=inconnU/Installé/suppRimé/Purgé/H=à garder | État=Non/Installé/fichier-Config/dépaqUeté/échec-conFig/H=semi-installé/W=attend-traitement-déclenchements |/ Err?=(aucune)/besoin Réinstallation (État,Err: majuscule=mauvais) ||/ Nom Version Architecture Description +++-===================-==============-==============-============================================ ii libncurses5:amd64 6.0+20160213-1 amd64 shared libraries for terminal handling ii libncurses5:i386 6.0+20160213-1 i386 shared libraries for terminal handling ii libncursesw5:amd64 6.0+20160213-1 amd64 shared libraries for terminal handling (wide ii ncurses-base 6.0+20160213-1 all basic terminal type definitions ii ncurses-bin 6.0+20160213-1 amd64 terminal-related programs and man pages un ncurses-runtime (aucune description n'est disponible) ii ncurses-term 6.0+20160213-1 all additional terminal type definition Si libncurses apparaît dans la liste, le paquet ncurses est installé. Une autre manière un peu simpliste mais très efficace de le savoir consiste tout simplement à saisir 'tput' dans le terminal : $ tput usage: tput [-V] [-S] [-T term] capname Installation du paquet ncurses Fin 2018, la dernière version de la libriairie ncurses présente dans les dépôts est la version 5. Elle s'installe ainsi : $ sudo apt-get install libncurses5 ==== Mise en couleur ==== === Mise en couleur du texte (échappement ANSI) : setaf === La commande setaf, suivie d'un code numérique de 1 à 7 permet de changer la couleur du texte. Setaf fonctionne avec les terminaux xterm (a priori cas général sous Ubuntu). On utilise sgr0 pour revenir aux valeurs par défaut. syntaxe : $ tput setaf [code_couleur] === Mise en couleur du texte (sans échappement du texte) : setf === La commande setf ne paraît pas fonctionner dans les terminaux xterm. $ tput setf [code_couleur] === Mise en couleur de l'arrière plan (background - échappement ANSI) : setab === $ tput setab [code_couleur] === Mise en couleur de l'arrière plan (background - sans échappement du texte) : setb === La commande setb ne paraît pas fonctionner dans les terminaux xterm. $ tput setb [code_couleur] === Tableau des couleurs : === ^ Couleur ^ Code ^ ^ | noir |0| | | rouge | 1 | | | vert |2| | | jaune |3| | | bleu |4| | | magenta |5| | | cyan |6| | | blanc |7| | Le nombre des couleurs possible est désormais généralement égal à 256 au moins. Pour le vérifier, il suffit de saisir dans le terminal la commande suivante : $ tput colors Si le retour de la commande est '256', vous pouvez étendre votre terrain de jeux. Le code couleur doit être annoncé sur 3 chiffres (de 001 à 256). === Exemples d'utilisation permettant de rendre l'usage plus simple === Syntaxe de base de tput $ echo "Texte ordinaire "$(tput setaf 3; tput setab 1)"jaune sur fond rouge"$(tput sgr0)" à nouveau ordinaire." Cette syntaxe peut être rendue plus compréhensible en utilisant des variables bien choisies. Ainsi, dans l'exemple suivant, l’affichage de $rouge place le texte en rouge, celui de $ordinaire rétabli les paramètres par défaut : $ rouge=$(tput setaf 1) $ ordinaire=$(tput sgr0) $ echo "avant ""$rouge""Le Texte""$ordinaire"" après" === Un script en guise d'aide-mémoire === Pour afficher les 8 couleurs principales : #!/bin/bash couleurs=(Noir Rouge Vert Jaune Bleu Magenta Cyan Blanc); for i in $(seq 1 7); do echo -e " $(tput setaf $i)${couleurs[$i]}\tTexte$(tput sgr0)\t$(tput bold)$(tput setaf $i)Texte$(tput sgr0)\t$(tput sgr 0 1)$(tput setaf $i)Texte$(tput sgr0)\t(tput setaf $i)"; done exit 0; et le résultat : {{ :tutoriel:tput_xenial_01.png?direct&600 |}} Pour visualiser les 256 couleurs possibles $ for i in {0..256};do o=00$i;echo -ne "${o:${#o}-3:3} "$(tput setaf $i;tput setab $i)" "$(tput sgr0);done; {{ :administration:tput_xenial_02.png?direct&600 |}} ==== S'informer sur les dimensions du terminal ==== tput lines et tput cols permettent de déterminer le nombre de ligne et de colonnes du terminal. tput lines tput cols ==== Déplacer le curseur à l'intérieur du terminal ==== Placer le curseur en position x y (colonnes et lignes) tput cup Y X tput cup 6 9 La dernière commande place le curseur en colonne 6 ligne 9 === Déplacer le curseur vers la gauche === Déplacement d'un caractère vers la gauche : cub1 tput cub1 Déplacement de N caractère vers la gauche : cub N tput cub N echo "Anticonstitutionnellement"$(tput cub 10)"sèche" echo "Anticonstitutionnellement"$(tput cub 21)"sèche"$(tput el) === Déplacer le curseur vers la droite === Déplacement d'un caractère vers la droite : cuf1 tput cuf1 echo "UN""exemple qui ajoute un espace" echo "UN"$(tput cuf1)"exemple qui ajoute un espace" Déplacement de N caractère vers la droite : cuf N tput cuf N === Remonter d'une ligne === tput cuu1 === Se rendre en dernière ligne, première colonne === tput ll === Revenir à la position initiale === Tput peut enregistrer une position avec 'tput sc' puis y revenir après plusierus dépalcements avec 'tput rc' tput sc ... tput rc ==== Insérer et effacer du texte ==== === Insertion === Insertion d'un caractère tput ich1 Insertion de N caractères tput ich N Insertion de N lignes tput il N Insert N lignes === Effacement === Effacement de N caractères tput ech N Effacement du début de la ligne (par rapport à la position courante) tput el1 echo "Anticonstitutionnellement" echo "Anti"$(tput el1)"constitutionnellement" Effacement de la fin de la ligne (par rapport à la position courante) tput el echo "Anticonstitutionnellement"$(tput cub 6; tput el) Effacement jusqu'à la fin de l'écran (par rapport à la position courante) tput ed Effacement de l'ensemble de l'écran et déplacement du curseur en position 0,0 (en haut à gauche) tput clear Pour obtenir davantage d'informations sur tput (en anglais, of course) : ne pas oublier le manuel man tput man terminfo ===== Voir aussi ===== * [[http://www.tux-planet.fr/les-codes-de-couleurs-en-bash/|les codes couleurs en bash]] sur le site tux-planet **(fr)** * [[https://www.commentcamarche.com/faq/14740-coloration-du-shell-bash|coloration du shell bash]] **(fr)** * [[https://www.admin-linux.fr/bash-de-la-couleur-dans-le-shell/|Bash : De la couleur dans le shell]] **(fr)** * [[https://unix.stackexchange.com/questions/269077/tput-setaf-color-table-how-to-determine-color-codes|Connaître les couleurs disponibles avec setaf]] **(en)** * [[https://tldp.org/HOWTO/Bash-Prompt-HOWTO/x361.html|Mouvement du curseur]] **(en)** Tput * [[http://ti1.free.fr/index.php/bash-tput/|Aide-mémoire tput]] **(fr)** * [[https://www.it-connect.fr/linux-gestion-dadressage-du-curseur-avec-tput/|Linux : Gestion d’adressage du curseur avec tput]] **(fr)** * [[https://www.commentcamarche.com/faq/6458-la-commande-tput|La commande tput]] **(fr)** * [[http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x405.html|Coloration et déplacement du curseur avec tput]] **(en)** * [[https://raymii.org/s/snippets/Bash_Bits_Add_Color_Output_To_Your_Scripts.html|Ajoutez des couleurs aux sorties de vos scripts]] **(en)** * [[http://www.linuxcommand.org/lc3_adv_tput.php|Créer une horloge]] **(en)** * [[https://en.wikipedia.org/wiki/Tput|Tput sur wikipedia]] **(en)** * [[https://man7.org/linux/man-pages/man1/tput.1.html|Page man]] **(en)** * [[https://www.gnu.org/software/termutils/manual/termutils-2.0/html_chapter/tput_1.html|tput sur gnu.org]] * [[https://www.thegeekstuff.com/2011/01/tput-command-examples/|9 UNIX / Linux tput Examples: Control Your Terminal Color and Cursor]] **(en)** * [[https://stackoverflow.com/questions/14259311/set-or-change-vertical-position-of-the-cursor|Un menu pour vos scripts]] **(en)** * [[https://stackoverflow.com/questions/18893492/why-is-there-both-setf-setb-and-setaf-setab-in-tput|Why is there both setf/setb and setaf/setab in tput?]] **(en)** Personnaliser le prompt * [[https://www.admin-linux.fr/personnaliser-le-prompt/|Personnaliser le prompt]] **(fr)** * [[https://www.commentcamarche.com/faq/14740-coloration-du-shell-bash|Coloration de l'invite de commande]] **(fr)** * [[https://wiki.archlinux.org/index.php/Bash/Prompt_customization|Personnalisation du prompt]] **(en)** ---- //Contributeurs principaux : [[:utilisateurs:zococo|zococo]].//