#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
#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
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 !
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,
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 !
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)"
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é !
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
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
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 MicP !
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
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 !
Xubuntu - Voyager 18.04 et 22.04
Hors ligne