Changer la police dans la commande echo

16

Est-il possible de changer les attributs de police de la sortie d'écho dans zsh ou bash?

Ce que je voudrais, c'est quelque chose qui ressemble à:

echo -n "This is the font: normal "
echo -n $font=italic "italic,"
echo -n $font=bold "bold,"
echo -n "and"
echo -n $font=small "small".

pour qu'il affiche: "Ceci est la police: normal, italique , gras , petit " dans une ligne de texte.

Sardathrion - Rétablir Monica
la source
Cela a plus à voir avec l'émulateur de terminal en question qu'avec le shell utilisé. Ce fil de questions contient des
conseils
Normalement, vous ne pouvez pas modifier la taille de la police. La seule chose que vous pouvez généralement faire est de changer la couleur et parfois l'attribut gras / souligné. Pour cela, vous pouvez utiliser des séquences d'échappement ANSI. Voir par exemple bashguru.com/2010/01/shell-colors-colorizing-shell-scripts.html pour quelques exemples.
jofel

Réponses:

15

Sur la plupart, sinon tous les émulateurs de terminal, vous ne pouvez pas définir différentes tailles de police ou différentes polices, uniquement des couleurs et quelques attributs (gras, souligné, remarquable).

En bash (ou en zsh ou tout autre shell), vous pouvez utiliser directement les séquences d'échappement du terminal (à part quelques-unes exotiques, tous les terminaux suivent l'exemple de xterm de nos jours). CSIest ESC [écrit $'\e['en bash. La séquence d'échappement pour modifier les attributs est CSI Ps m.

echo $'\e[32;1mbold red\e[0mplain\e[4munderlined'

Zsh a une fonction pratique pour cela.

autoload -U colors
colors
echo $bold_color$fg[red]bold red${reset_color}plain$'\e'$color[underline]munderlined
Gilles 'SO- arrête d'être méchant'
la source
16

Vous pouvez inclure ces définitions de couleurs dans un script ou un fichier source. Pourrait ressembler à quelque chose comme ça.

#!/bin/bash
PATH=/bin:/usr/bin:

NONE='\033[00m'
RED='\033[01;31m'
GREEN='\033[01;32m'
YELLOW='\033[01;33m'
PURPLE='\033[01;35m'
CYAN='\033[01;36m'
WHITE='\033[01;37m'
BOLD='\033[1m'
UNDERLINE='\033[4m'

echo -e "This text is ${RED}red${NONE} and ${GREEN}green${NONE} and ${BOLD}bold${NONE} and ${UNDERLINE}underlined${NONE}."

tput sgr0

Notez que vous devez réinitialiser les codes de couleur ANSI après chaque instance où vous invoquez une modification. Le tput sgr0réinitialise toutes les modifications que vous avez apportées au terminal.

Je crois que changer la taille de la police ou l'italique serait spécifique au terminal que vous utilisez.

Bien que ce guide soit spécifique à la personnalisation de votre invite bash, il constitue une bonne référence pour les codes de couleur et génère quelques idées de ce que vous pouvez faire.

George M
la source
5

On dirait que la mise en page ne peut pas gérer le [0x1b]caractère devant le [.

La première ligne est en gras:

 echo -e "\x1b[1m bold"
     echo -e "\x1b[30m black"
     echo -e "\x1b[31m red"
     echo -e "\x1b[32m green"
     echo -e "\x1b[33m yellow"
     echo -e "\x1b[34m blue"
     echo -e "\x1b[35m mag"
     echo -e "\x1b[36m cyan"
     echo -e "\x1b[37m white"   

Pour le type général, je sais seulement

echo -e "\x1b[0m io-std"
echo -e "\x1b[1m bold"
echo -e "\x1b[2m normal"

et des commentaires, merci manatwork et GypsyCosmonaut:

echo -e "\x1b[3m italic"
echo -e "\x1b[4m underlined"
echo -e "\x1b[5m blinking"
echo -e "\x1b[7m inverted"

et je ne connais pas la différence entre io-std et normal.

Je n'ai pas vu d'italique ou de petit dans la coquille.

Vous pouvez les saisir (grâce aussi à la manœuvre) par Ctrl + v ESC dans le Bash, où il sera affiché comme ^[. Cela signifie que toute la séquence ANSI ressemblera à ^[[1m boldou ^[[1mbold(pour éviter le blanc avant "gras").

De nombreux éditeurs ont des problèmes avec (char) 0x1b. Alternatives: copiez / collez de quelque part, ou utilisez

echo -e "\x1b[1m bold"

en bash, ou un éditeur hexadécimal.

Utilisateur inconnu
la source
1
Les caractères d'échappement peuvent être saisis: Ctrl + V, Esc. (S'affichera comme «^ [». Cela signifie que toute la séquence ANSI ressemblera à «^ [[1mbold».)
manatwork
1
Il y a plus d'attributs à mentionner: \e[4msouligné, \e[5mclignotant, \e[7minversé.
manatwork
@manatwork: les a ajoutés.
utilisateur inconnu
@userunknown Merci d'avoir aidé, de bricoler votre code, j'ai trouvé que l'italique estecho -e "\x1b[3m italic"
GypsyCosmonaut
0

Ici:

http://en.wikipedia.org/wiki/ANSI_escape_code

(Remarque: beaucoup d'entre eux ne fonctionnent généralement pas, mais la plupart d'entre eux sont marqués ainsi.)

Je fais un jeu dans le terminal et je compte beaucoup sur le lien ci-dessus. Il vous indique même comment masquer / afficher le curseur, rendre la couleur (30), "gras" (plus clair), plus sombre, souligné, italique, la couleur d'arrière-plan (40 au lieu de 30), etc. Vous pouvez également modifier l'emplacement du curseur ( ce qui est très utile - par exemple, "\x1B[1A"déplace le curseur d'une ligne vers le haut; "\x1B[0;0H"déplace le curseur vers la ligne 0, col 0; "\x1B[2J"efface l'écran; "\x1B[2K"efface la ligne.

Pour vos besoins, comme les gens l'ont dit:

echo -e "\x1b[30;44m black with blue background \x1b[m"

echo -e "\x1b[31;42m red with green background \x1b[m"

echo -e "\x1b[32;40m green with black background \x1b[m"

echo -e "\x1b[8m Invisible; na na na na boo boo \x1b[m"

Note: Vous devez l' -een

echo **-e** "\x1b[35;1m Light purple \x1b[m"

ou vous devez utiliser des guillemets simples. Tapez man echopour voir pourquoi (les guillemets doubles sont généralement pénibles lors de l'impression; lorsque j'ai besoin de choses pour ne pas se développer ou que j'ai besoin de séquences d'échappement ANSI, j'utilise des guillemets simples parce que c'est facile - même si je m'y suis habitué en le faisant tant de fois - oublier le -e auquel cas vous obtenez " box with numbers and letters[35; 1m").

Chaque fois que vous voyez, CSIremplacez-le par "\x1b["(ou "\e["ou "\u1b["). "\x1b["Je pense que c'est plus standard, mais je ne sais pas vraiment quelle est la différence entre eux.

Dylan
la source
Si vous aimez encombrer vos chaînes de caractères supplémentaires, n'utilisez pas \ e :-)
clearlight
@clearlight Je ne sais pas trop ce que tu veux dire. Je pense que vous auriez pu vouloir dire "use \ e". Cependant, \eest moins pris en charge que \x1bje l'ai trouvé. La meilleure chose à faire serait soit esc=$'\e'ou esc=$'\x1b'(c'est en bash), puis utiliser "${esc}[34;1m"(pour, par exemple, le bleu vif). J'ai un exemple semi-complexe ici ( github.com/dylnmc/ps1porn/blob/master/powerline.sh ) pour une vraie chaîne d'invite bash;) Veuillez pardonner le nom du dépôt - vous pouvez remercier les gens du canal # de freenode archlinux-offtopic pour cela.
Dylan
La raison de cela esc=$'\e'est que cela permet à bash de créer le personnage ansi-escape sur place, et vous en bénéficiez de plusieurs manières. Parfois, en fait, (comme le montre le lien github), vous devez utiliser cette méthode pour que la couleur s'affiche correctement. Pour les anciennes versions de bash ainsi que le shell sh, vous devez (mais pas besoin) utiliser cette méthode pour faire apparaître la couleur ... à condition que le terminal utilise les séquences d'échappement que la plupart des terminaux modernes utilisent.
Dylan