Je souhaite implémenter une barre de progression indiquant les secondes écoulées dans bash. Pour cela, je dois effacer la dernière ligne affichée à l'écran (la commande "effacer" efface tout l'écran, mais je n'ai besoin d'effacer que la ligne de la barre de progression et de la remplacer par les nouvelles informations).
Le résultat final devrait ressembler à:
$ Elapsed time 5 seconds
Ensuite, après 10 secondes, je veux remplacer cette phrase (dans la même position dans l'écran) par:
$ Elapsed time 15 seconds
for i in {1..100000}; do echo -en "\r$i"; done
pour éviter l'appel suivant :-)Le retour chariot en lui-même ne déplace le curseur qu'au début de la ligne. C'est OK si chaque nouvelle ligne de sortie est au moins aussi longue que la précédente, mais si la nouvelle ligne est plus courte, la ligne précédente ne sera pas complètement écrasée, par exemple:
Pour effacer réellement la ligne du nouveau texte, vous pouvez ajouter
\033[K
après le\r
:http://en.wikipedia.org/wiki/ANSI_escape_code
la source
\e[K
place de\033[K
.\033[G
io\r
avant,\033[K
bien que ce soit évidemment\r
beaucoup plus simple. Aussi invisible-island.net/xterm/ctlseqs/ctlseqs.html donne plus de détails que Wikipedia et est du développeur xterm.La réponse de Derek Veit fonctionne bien tant que la longueur de la ligne ne dépasse jamais la largeur du terminal. Si ce n'est pas le cas, le code suivant empêchera la sortie indésirable:
avant que la ligne ne soit écrite pour la première fois, faites
qui enregistre la position actuelle du curseur. Désormais, chaque fois que vous souhaitez imprimer votre ligne, utilisez
pour revenir d'abord à la position enregistrée du curseur, puis effacer l'écran du curseur vers le bas, et enfin écrire la sortie.
la source
tput sc # save cursor echo '' > sessions.log.json while [ 1 ]; do curl 'http://localhost/jolokia/read/*:type=Manager,*/activeSessions,maxActiveSessions' >> sessions.log.json echo '' >> sessions.log.json cat sessions.log.json | jq '.' tput rc;tput el # rc = restore cursor, el = erase to end of line sleep 1 done
tput ed
plutôt quetput el
. L'exemple de @ Um utiliséed
(peut-être qu'il l'a corrigé après que vous ayez commenté).La méthode \ 033 n'a pas fonctionné pour moi. La méthode \ r fonctionne mais elle n'efface rien, place simplement le curseur au début de la ligne. Donc, si la nouvelle chaîne est plus courte que l'ancienne, vous pouvez voir le texte restant à la fin de la ligne. En fin de compte, tput était la meilleure voie à suivre. Il a d'autres utilisations en plus du curseur et est pré-installé dans de nombreuses distributions Linux et BSD, il devrait donc être disponible pour la plupart des utilisateurs de bash.
Voici un petit script de compte à rebours avec lequel jouer:
la source
Dans le cas où la sortie de progression est sur plusieurs lignes, ou si le script aurait déjà imprimé le caractère de nouvelle ligne, vous pouvez sauter des lignes avec quelque chose comme:
printf "\033[5A"
ce qui fera sauter le curseur de 5 lignes. Ensuite, vous pouvez écraser tout ce dont vous avez besoin.
Si cela ne fonctionne pas, vous pouvez essayer
printf "\e[5A"
ouecho -e "\033[5A"
, ce qui devrait avoir le même effet.Fondamentalement, avec les séquences d'échappement, vous pouvez contrôler presque tout à l'écran.
la source
tput cuu 5
, où 5 est le nombre de lignes (cuu
pour monter,cud
pour descendre).Utilisez le caractère de retour chariot:
la source
Peut y parvenir en plaçant le retour chariot
\r
.En une seule ligne de code avec
printf
ou avec
echo -ne
la source