Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 14/07/2019, à 10:25

jlfh0816

[RESOLU] bash adapter affichage printf ou echo à la largeur de fenêtre

Bonjour,

Je ne connais pas grand-chose aux scripts bash mais, à force de fureter sur la toile, j’ai bidouillé ce petit script qui affiche une sinusoïde sur la fenêtre du terminal :

#!/bin/bash
chars='⠁⠂⠄⡀⢀⠠⠐⠈'
while :; do
 for (( i=0; i<${#chars}; i++ ));
 do
printf ${chars:$i:1}
#echo -ne "${chars:$i:1}" (alternative à la commande printf)
 sleep .1;
 done
printf ' '
done
exit

Mon problème, c’est que lorsque la sinusoïde a atteint le bord droit de la fenêtre, elle passe à la ligne suivante et recommence une nouvelle sinusoïde en dessous de la première.

Y a-t-il un moyen de l'en empêcher ?

Lorsque le bord de la fenêtre est atteint, est-il possible d'effacer la sinusoïde puis d'en générer une nouvelle (sur la même ligne) ?

Et surtout, dans l’idéal, est-il possible que l'arrêt de l’affichage de la commande printf (ou echo) s’adapte automatiquement à la largeur de la fenêtre ?

Merci par avance de votre aide !

Dernière modification par jlfh0816 (Le 14/07/2019, à 17:40)


Xubuntu - Voyager 18.04 et 22.04

Hors ligne

#2 Le 14/07/2019, à 10:37

bruno

Re : [RESOLU] bash adapter affichage printf ou echo à la largeur de fenêtre

Bonjour,

Avec tput tu auras le nombre de colonnes disponibles dans le terminal actif.

tput cols

Hors ligne

#3 Le 14/07/2019, à 10:42

jlfh0816

Re : [RESOLU] bash adapter affichage printf ou echo à la largeur de fenêtre

@bruno
Merci bruno, je vais me renseigner sur la toile pour savoir comment utiliser cette commande tput à mon cas précis.


Xubuntu - Voyager 18.04 et 22.04

Hors ligne

#4 Le 14/07/2019, à 11:29

Watael

Re : [RESOLU] bash adapter affichage printf ou echo à la largeur de fenêtre

en bash, tput cols = $COLUMNS.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#5 Le 14/07/2019, à 13:48

MicP

Re : [RESOLU] bash adapter affichage printf ou echo à la largeur de fenêtre

Bonjour

#!/bin/bash

motif="⠁⠂⠄⡀⢀⠠⠐⠈ "
tempo=0.1

columns=$(tput cols)
longMotif=${#motif}

repet=$(( columns / longMotif ))
reste=$(( columns % longMotif ))

for (( i=0; i<$repet; i++ )); do
    printf "$motif"
    sleep $tempo
done
printf "%s\n" "${motif:0:$reste}"

EDIT : Modifié, voir mon message suivant.

Dernière modification par MicP (Le 14/07/2019, à 14:52)

Hors ligne

#6 Le 14/07/2019, à 14:32

jlfh0816

Re : [RESOLU] bash adapter affichage printf ou echo à la largeur de fenêtre

@Watael
merci !

@MlcP
Merci beaucoup de ta réponse et du temps que tu as passé sur mon problème.
J'ai copié-collé ta proposition de script (j'ai appelé ce script Nouveau1.sh) et voici les erreurs que m'affiche en retour le terminal :

jlfh0816 @ Voyager1804  ~
└─ $ ▶ ./Nouveau1.sh
./Nouveau1.sh: ligne 6: / 9 : erreur de syntaxe : opérande attendu (le symbole erroné est « / 9 »)
./Nouveau1.sh: ligne 7: % 9 : erreur de syntaxe : opérande attendu (le symbole erroné est « % 9 »)
./Nouveau1.sh: ligne 9: ((: i< : erreur de syntaxe : opérande attendu (le symbole erroné est « < »)

De mon côté, j'ai continué à chercher sur la toile et j'ai trouvé la ligne de commande ci-dessous sur ce site :

printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' -

Elle affiche une ligne de tirets -------- qui est effectivement adaptée à la largeur de la fenêtre du terminal mais impossible de lui faire afficher autre chose et notamment mes sept caractères spéciaux ⠁⠂⠄⡀⢀⠠⠐⠈ .
Et ça ne résoud pas non plus le problème d'effacer la ligne de tirets lorsque celle-ci est pleine > faire revenir le curseur au début de la ligne > commencer une nouvelle ligne de tirets (en boucle infinie)

Merci en tout cas beaucoup d'avoir pris le temps de me répondre  smile

Dernière modification par jlfh0816 (Le 14/07/2019, à 14:47)


Xubuntu - Voyager 18.04 et 22.04

Hors ligne

#7 Le 14/07/2019, à 14:50

MicP

Re : [RESOLU] bash adapter affichage printf ou echo à la largeur de fenêtre

Oui, je viens de le corriger :
la variable COLUMNS n'étant pas accessible depuis le script,
j'en ai recréé une (du même nom mais en minuscule) en utilisant la commande tput

En voilà un autre
mais qui affiche le motif point par point

#!/bin/bash

motif="⠁⠂⠄⡀⢀⠠⠐⠈ "
tempo=0.02

columns=$(tput cols)
longMotif="${#motif}"

repet=$(( columns / longMotif ))
reste=$(( columns % longMotif ))

affPointApoint() {
    longChaine=${#1}
    for (( i=0; i<$longChaine; i++ )); do
        printf "${1:$i:1}"
        sleep $tempo
    done
}

for (( x=0; x<$repet; x++ )); do
    affPointApoint "$motif"
done
affPointApoint "${motif:0:$reste}"
printf "\n"

Dernière modification par MicP (Le 14/07/2019, à 15:08)

Hors ligne

#8 Le 14/07/2019, à 15:05

jlfh0816

Re : [RESOLU] bash adapter affichage printf ou echo à la largeur de fenêtre

@MicP
Oui, super, ça fonctionne comme ça !
Merci beaucoup de ton aide !!!

Si je n'abuse pas, as-tu une idée quant à la façon de procéder pour que la sinusoïde s'efface lorsqu'elle est complète puis que le curseur revienne au début de la ligne et qu'enfin une nouvelle sinusoïde s'affiche (une boucle infinie) ?

Merci infiniment en tout cas d'avoir déjà résolu une partie de mon problème !  big_smile


Xubuntu - Voyager 18.04 et 22.04

Hors ligne

#9 Le 14/07/2019, à 15:08

nany

Re : [RESOLU] bash adapter affichage printf ou echo à la largeur de fenêtre

Bonjour,

jlfh0816 a écrit :

Et ça ne résoud pas non plus le problème d'effacer la ligne de tirets lorsque celle-ci est pleine > faire revenir le curseur au début de la ligne > commencer une nouvelle ligne de tirets (en boucle infinie)

printf "\r$(tput el)"

Un script complet avec animation point par point :

#!/bin/bash

chars='⠁⠂⠄⡀⢀⠠⠐⠈'
col=0

testline() {
if [[ $col -eq $(tput cols) ]]; then
  printf "\r$(tput el)"
  col=0
fi
}

while :
do
for (( i=0; i<${#chars}; i++ ))
  do
    ((col++))
    printf ${chars:$i:1}
    testline
    sleep .1
  done
  ((col++))
  printf ''
  testline
done

exit

Dernière modification par nany (Le 14/07/2019, à 15:12)

Hors ligne

#10 Le 14/07/2019, à 15:20

jlfh0816

Re : [RESOLU] bash adapter affichage printf ou echo à la largeur de fenêtre

@nany
Alors là, un super grand merci, ton script fonctionne à la perfection.
Je me suis même amusé à faire varier la taille de la fenêtre pendant son exécution et il continue de fonctionner en s'adaptant automatiquement à la nouvelle dimension de la fenêtre ... du grand art, bravo !  cool


Xubuntu - Voyager 18.04 et 22.04

Hors ligne

#11 Le 14/07/2019, à 15:29

MicP

Re : [RESOLU] bash adapter affichage printf ou echo à la largeur de fenêtre

Même script qu'en #7 mais dans une boucle infinie.

(Il faudra taper sur Ctrl-C pour stopper l'exécution du script.)

#!/bin/bash

motif="⠁⠂⠄⡀⢀⠠⠐⠈ "
tempo=0.02

longMotif="${#motif}"

affPointApoint() {
    longChaine=${#1}
    for (( i=0; i<$longChaine; i++ )); do
        printf "${1:$i:1}"
        sleep $tempo
    done
}

while :; do
    columns=$(tput cols)
    repet=$(( columns / longMotif ))
    reste=$(( columns % longMotif ))
    for (( x=0; x<$repet; x++ )); do
        affPointApoint "$motif"
    done
    affPointApoint "${motif:0:$reste}"
    printf "\n"
done

Dernière modification par MicP (Le 14/07/2019, à 15:53)

Hors ligne

#12 Le 14/07/2019, à 15:46

jlfh0816

Re : [RESOLU] bash adapter affichage printf ou echo à la largeur de fenêtre

@MicP
Je viens de tester ta proposition de script: il fonctionne très bien !
Merci +++

Dernière modification par jlfh0816 (Le 14/07/2019, à 15:49)


Xubuntu - Voyager 18.04 et 22.04

Hors ligne

#13 Le 14/07/2019, à 15:48

nany

Re : [RESOLU] bash adapter affichage printf ou echo à la largeur de fenêtre

Pour utiliser le script de MicP, il suffit de remplacer

printf "\n"

par

printf "\r$(tput el)"

wink

Hors ligne

#14 Le 14/07/2019, à 15:51

jlfh0816

Re : [RESOLU] bash adapter affichage printf ou echo à la largeur de fenêtre

@nany
D'accord nany, merci pour ta remarque, c'est bien noté !  smile

Par contre, si je fais cette substitution de ligne de commande, la sinusoïde ne s'adapte pas au redimensionnement de fenêtre si on l'effectue pendant que le script est déjà lancé (alors qu'avec ton script du #9, ça le fait).
Mais bon, c'est du détail, le principal est acquis et très bien réalisé grâce à vous deux. Encore merci.

Dernière modification par jlfh0816 (Le 14/07/2019, à 16:19)


Xubuntu - Voyager 18.04 et 22.04

Hors ligne

#15 Le 14/07/2019, à 15:56

melixgaro

Re : [RESOLU] bash adapter affichage printf ou echo à la largeur de fenêtre

Salut,
il me semble que dans le script de nany ces trois lignes sont inutiles

  ((col++))
  printf ''
  testline

En tout cas, il faut au moins enlever le ((col++)) car sinon, quand j'exécute le code chez moi, la sinusoïde redémarre avant d'atteindre la dernière colonne du terminale (test avec terminal agrandi à 180 cols).


Linux depuis ~2007. Xubuntu seulement.

Hors ligne

#16 Le 14/07/2019, à 16:03

MicP

Re : [RESOLU] bash adapter affichage printf ou echo à la largeur de fenêtre

J'ai fait celui là aussi,

#!/bin/bash

motif="⠁⠂⠄⡀⢀⠠⠐⠈ "
tempo=0.02
longMotif="${#motif}"

affPointApoint() {
    longChaine=${#1}
    for (( i=0; i<$longChaine; i++ )); do
        printf "${1:$i:1}"
        sleep $tempo
    done
}

while :; do
    tput clear   # efface tout ce qui est affiché à l'écran et positionne le curseur en haut à gauche
    columns=$(tput cols)

    repet=$(( columns / longMotif ))
    reste=$(( columns % longMotif ))
    for (( x=0; x<$repet; x++ )); do
        affPointApoint "$motif"
    done
    affPointApoint "${motif:0:$reste}"
done

L'idéal serait de réaliser une fonction qui mettrait à jour les variables "repet" et "reste"
et qui serait déclenchée par l'évènement "onresize" de la fenêtre de terminal…

Dernière modification par MicP (Le 14/07/2019, à 16:14)

Hors ligne

#17 Le 14/07/2019, à 16:09

jlfh0816

Re : [RESOLU] bash adapter affichage printf ou echo à la largeur de fenêtre

melixgaro a écrit :

En tout cas, il faut au moins enlever le ((col++)) car sinon, quand j'exécute le code chez moi, la sinusoïde redémarre avant d'atteindre la dernière colonne du terminale (test avec terminal agrandi à 180 cols).

Ah oui, tu as raison, dans le script de nany (post #9), le simple fait d'enlever le ((col++)) de la ligne 19 permet à la sinusoïde d'atteindre le bord de la fenêtre alors que sinon, elle s'arrête un petit peu avant.
Par contre, il faut laisser en place le ((col++)) de la ligne 14 sinon la sinusoïde passe à la ligne suivante lorsqu'elle atteint le bord de la fenêtre.

Merci à toi  melixgaro !

Dernière modification par jlfh0816 (Le 14/07/2019, à 16:18)


Xubuntu - Voyager 18.04 et 22.04

Hors ligne

#18 Le 14/07/2019, à 16:15

jlfh0816

Re : [RESOLU] bash adapter affichage printf ou echo à la largeur de fenêtre

MicP a écrit :

J'ai fait celui là aussi,

Ah oui, ça fonctionne très bien également et on peut redimensionner la fenêtre pendant l'exécution du script, la sinusoïde s'adapte automatiquement à la nouvelle dimension de la fenêtre, comme avec le script de nany du post #9.

Sois remercié de tous tes efforts MicPsmile

MicP a écrit :

L'idéal serait de réaliser une fonction qui mettrait à jour les variables "repet" et "reste"
et qui serait déclenchée par l'évènement "onresize" de la fenêtre de terminal…

Tu as sûrement raison mais là, je suis incapable de t'aider, c'est vraiment hors de mes connaissances ....

Dernière modification par jlfh0816 (Le 14/07/2019, à 16:22)


Xubuntu - Voyager 18.04 et 22.04

Hors ligne

#19 Le 14/07/2019, à 17:06

MicP

Re : [RESOLU] bash adapter affichage printf ou echo à la largeur de fenêtre

J'ai trouvé le nom de l'évènement
et comment l'utiliser :

#!/bin/bash

motif="⠁⠂⠄⡀⢀⠠⠐⠈ "
tempo=0.04

recalcule() {
    columns=$( tput cols )
    repet=$(( columns / longMotif ))
    reste=$(( columns % longMotif ))
}

affPointApoint() {
    longChaine=${#1}
    for (( i=0; i<$longChaine; i++ )); do
        printf "${1:$i:1}"
        trap 'recalcule' SIGWINCH      # capture de l'évènement "onresize" de la fenêtre => activation fonction "recalcule"
        sleep $tempo
    done
}

longMotif="${#motif}"

while :; do
    recalcule
    tput clear   # efface tout ce qui est affiché à l'écran et positionne le curseur en haut à gauche
    for (( x=0; x<$repet; x++ )); do
        affPointApoint "$motif"
    done
    affPointApoint "${motif:0:$reste}"
done

Dernière modification par MicP (Le 14/07/2019, à 17:11)

Hors ligne

#20 Le 14/07/2019, à 17:39

jlfh0816

Re : [RESOLU] bash adapter affichage printf ou echo à la largeur de fenêtre

MicP a écrit :

J'ai trouvé le nom de l'évènement
et comment l'utiliser :

Alors là, chapeau bas, ça fonctionne très bien et on peut effectivement redimensionner "à la volée" sans problème. Je te suis vraiment très reconnaissant.

Je mets ce topic en "résolu"


NB: grâce à votre aide à tous, mon problème de sinusoïde est maintenant très efficacement résolu. Du coup, je vais essayer de bidouiller dans mon coin pour rediriger l'affichage de cette sinusoïde dans le titre d'une fenêtre active autre que celle du terminal, en utilisant cette ligne de commande comme base de départ :

wmctrl -r :ACTIVE: -N "$(awk -F' \\|\\|' '{print $1}' <<< $(xdotool getwindowfocus getwindowname)) || ici la sortie de la commande printf "

Je ne sais pas si j'y arriverai (ça ne m'a pas l'air évident) mais si c'était le cas, je ferai un edit pour le signaler.

Encore merci à toutes et à tous !


Xubuntu - Voyager 18.04 et 22.04

Hors ligne

#21 Le 18/07/2019, à 21:58

jlfh0816

Re : [RESOLU] bash adapter affichage printf ou echo à la largeur de fenêtre

EDIT

@ tous ceux qui ont eu la gentillesse de m'aider, voici ici ce à quoi je suis parvenu grâce à votre aide et votre bienveillance.

Encore merci  !  smile


Xubuntu - Voyager 18.04 et 22.04

Hors ligne