Comment faire pour supprimer et remplacer la dernière ligne dans le terminal à l'aide de bash?
Je veux mettre en œuvre une barre de progression indiquant les secondes écoulées en bash. Pour cela, j'ai besoin d'effacer la dernière ligne affichée à l'écran (commande "effacer" efface tout l'écran, mais j'ai besoin d'effacer seulement la ligne de la barre de progression et la remplacer par la nouvelle information).
Résultat Final devrait ressembler à:
$ Elapsed time 5 seconds
Puis au bout de 10 secondes, je veux remplacer cette phrase (dans la même position à l'écran) par:
$ Elapsed time 15 seconds
Vous devez vous connecter pour publier un commentaire.
écho à un retour de chariot avec \r
de l'homme de l'écho:
for i in {1..100000}; do echo -en "\r$i"; done
pour éviter la seq appel 🙂Le retour chariot en lui-même ne se déplace le curseur 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, sur la ligne précédente ne sera pas complètement écrasé, par exemple:
Pour vider la ligne pour le nouveau texte, vous pouvez ajouter
\033[K
après la\r
:http://en.wikipedia.org/wiki/ANSI_escape_code
\e[K
au lieu de\033[K
.\033[G
je.o.\r
avant\033[K
bien évidemment\r
est beaucoup plus simple. Aussi invisible-island.net/xterm/ctlseqs/ctlseqs.html donne plus de détails que Wikipédia et est de xterm développeur.Derek Veit réponse fonctionne bien aussi longtemps que la longueur de la ligne ne dépasse jamais le terminal de largeur. Si ce n'est pas le cas, le code suivant va éviter indésirable de sortie:
avant la ligne est écrite pour la première fois, ne
qui enregistre la position actuelle du curseur. Maintenant, chaque fois que vous souhaitez imprimer votre ligne, de
à retourner d'abord pour enregistrer la position du curseur, puis effacer l'écran à partir du curseur vers le bas, et enfin écrire la sortie.
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
. @Um de l'exemple utiliséed
(peut-être qu'il fixe après avoir commenté).L' \033 méthode ne fonctionne pas pour moi. Le \r méthode fonctionne, mais il ne fait pas effacer quoi que ce soit, met juste le curseur au début de la ligne. Donc, si la nouvelle chaîne est plus courte que l'ancienne, vous pouvez voir les restes de texte à la fin de la ligne. En fin de compte tput était la meilleure façon d'aller. Il a d'autres utilisations outre le curseur stuff plus il est livré pré-installé sur la plupart des Linux & BSD distributions de sorte qu'il devrait être disponible pour la plupart les utilisateurs de bash.
Voici un petit script de compte à rebours pour jouer avec:
Dans le cas où les progrès de sortie est multi-ligne, ou le script aurait déjà imprimé le caractère de nouvelle ligne, vous pouvez sauter des lignes avec quelque chose comme:
printf "\033[5A"
qui fera le curseur pour sauter 5 lignes maximum. Puis vous pouvez remplacer ce que vous avez besoin.
Si cela ne fonctionne pas vous pouvez essayer de
printf "\e[5A"
ouecho -e "\033[5A"
, qui devrait avoir le même effet.En fait, avec les séquences d'échappement vous pouvez contrôler presque tout l'écran.
Utiliser le caractère de retour chariot:
Pouvez l'obtenir en plaçant retour chariot
\r
.En une seule ligne de code avec
printf
ou avec
echo -ne
La façon la plus simple est d'utiliser le
\r
caractère je pense.L'inconvénient est que vous ne pouvez pas avoir de lignes complètes, comme il n'efface la ligne courante.
Exemple Simple: