web-dev-qa-db-fra.com

Comment faire clignoter un texte dans un script shell

J'ai ce morceau de code ci-dessous:

echo " \033[33mTitle of the Program\033[0m"

qui change la couleur en jaune.

Comment puis-je faire clignoter le texte "Titre du programme"?

12
user2519862

Essayez d'ajouter -e si ça ne marche pas sans ça

Vous devrez peut-être ajouter l'option -e à echo (du moins c'est requis sur tous les systèmes ou la plupart des systèmes que j'utilise). Ce qui suit indiquera à votre système de faire clignoter le texte:

echo  -e "\033[5mTitle of the Program\033[0m"

Vous pouvez faire clignoter et couleur

Et vous ne devez pas choisir soit jaune ou clignotant. Vous pouvez avoir votre gâteau et le manger aussi:

echo  -e "\033[33;5mTitle of the Program\033[0m"

Certains systèmes ignorent les codes clignotants

Votre système peut ignorer le code de clignotement - cela semble être assez courant. Si vous souhaitez que le texte soit visible, mais que le clignotement soit ignoré, vous pouvez inverser les couleurs avec 7:

echo  -e "\033[33;7mTitle of the Program\033[0m"

Ou vous pouvez utiliser le clignotement et inversion des couleurs (et le jaune):

echo  -e "\033[33;5;7mTitle of the Program\033[0m"
17
iconoclast

Que vous puissiez faire fonctionner clignotant _ ou non dépend du émulateur de terminal. Le système lui-même n'est pas pertinent.

L'exemple donné dans la question était proche, nécessitant seulement une modification de la séquence d'échappement pour "fonctionner" avec tout POSIX Shell :

echo  "\033[33;5mTitle of the Program\033[0m"

Le -e suggéré n'est pas nécessaire (il s'agit d'un bashisme, non standard et généralement inutile). Changer le 7 (inversion) en 5 (clignotant) fait ce qui a été demandé.

Plutôt que de coder en dur l’échappement, vous pouvez utiliser tput , par exemple,

printf '%s%s%s%s' "$(tput setaf 3)" "$(tput blink)" "Title of the Program" "$(tput sgr0)"

pour le même effet, avec deux différences:

  • l'expression est sans doute plus lisible,
  • utilise réellement les capacités de terminal connues, mais
  • suppose que vous utilisez une description de terminal appropriée, c'est-à-dire $TERM.

Par exemple, VTE (la bibliothèque utilisée pour divers skins tels que gnome-terminal) ne supporte pas blink (et il est possible de trouver les avis de ses développeurs sur le sujet dans divers bogues rapports). L'utilisation de infocmp pour afficher les capacités du terminal correspondant montre cela, ainsi que d'autres différences:

$ infocmp vte xterm
comparing vte to xterm.
    comparing booleans.
        km: F:T.
        mc5i: F:T.
        npc: F:T.
    comparing numbers.
    comparing strings.
        blink: NULL, '\E[5m'.
        cnorm: '\E[?25h', '\E[?12l\E[?25h'.
        cvvis: NULL, '\E[?12;25h'.
        enacs: '\E)0', NULL.
        is2: '\E[m\E[?7h\E[4l\E>\E7\E[r\E[?1;3;4;6l\E8', '\E[!p\E[?3;4l\E[4l\E>'.
        kb2: '\E[E', '\EOE'.
        kfnd: '\E[1~', NULL.
        kslt: '\E[4~', NULL.
        mc0: NULL, '\E[i'.
        mc4: NULL, '\E[4i'.
        mc5: NULL, '\E[5i'.
        rep: NULL, '%p1%c\E[%p2%{1}%-%db'.
        rmacs: '^O', '\E(B'.
        rmcup: '\E[2J\E[?47l\E8', '\E[?1049l'.
        rmm: NULL, '\E[?1034l'.
        rs2: '\E7\E[r\E8\E[m\E[?7h\E[!p\E[?1;3;4;6l\E[4l\E>\E[?1000l\E[?25h', '\E[!p\E[?3;4l\E[4l\E>'.
        setb: NULL, '\E[4%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m'.
        setf: NULL, '\E[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m'.
        sgr: '\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p5%t;2%;%?%p7%t;8%;%?%p1%p3%|%t;7%;m%?%p9%t\016%e\017%;', '%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p5%t;2%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m'.
        sgr0: '\E[0m\017', '\E(B\E[m'.
        smacs: '^N', '\E(0'.
        smcup: '\E7\E[?47h', '\E[?1049h'.
        smm: NULL, '\E[?1034h'.

Si vous utilisez KDE konsole, les différences sont plus longues (bien que konsole supporte clignote).

3
Thomas Dickey

Un petit travail pour faire clignoter la ligne dans le script bash

for (( i=0;i<=3;i++))
do
#Below line will deleted the before printed line
echo -en "\033[1A"
echo -en "EmpNo:$empno already exists\n";
sleep 0.4s;
#Below line to print a blank line
echo -en "\033[1A"
echo -en "                                                            \n";                                                                         
sleep 0.2s;
done
echo -en "\033[2A"
echo -en "                                                            \n";
echo -en "\033[1A"
echo -en "Enter the empno       : "; read empno1;
1
Nike