112 votes

Comment supprimer et remplacer la dernière ligne du terminal avec bash?

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 ne dois effacer que la ligne de la barre de progression et la remplacer par les nouvelles informations).

Le résultat final devrait ressembler à:

 $ Elapsed time 5 seconds
 

Puis, après 10 secondes, je souhaite remplacer cette phrase (à la même position à l'écran) par:

 $ Elapsed time 15 seconds
 

203voto

Derek Veit Points 775

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:

$ echo -e "abcdefghijklmnopqrstuvwxyz\r0123456789"
0123456789klmnopqrstuvwxyz

Pour vider la ligne pour le nouveau texte, vous pouvez ajouter \033[K après l' \r:

$ echo -e "abcdefghijklmnopqrstuvwxyz\r\033[K0123456789"
0123456789

http://en.wikipedia.org/wiki/ANSI_escape_code

123voto

Ken Points 23619

faire écho à un retour chariot avec \ r

 seq 1 1000000 | while read i; do echo -en "\r$i"; done
 

de l'homme echo:

 -n     do not output the trailing newline
-e     enable interpretation of backslash escapes

\r     carriage return
 

21voto

Um. Points 38

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

tput sc

qui enregistre la position actuelle du curseur. Maintenant, chaque fois que vous souhaitez imprimer votre ligne, l'utilisation

tput rc
tput ed
echo "your stuff here"

à retourner d'abord pour enregistrer la position du curseur, puis effacer l'écran à partir du curseur vers le bas, et enfin écrire la sortie.

4voto

Mikael S Points 2973

Utilisez le caractère de retour chariot:

 echo -e "Foo\rBar" # Will print "Bar"
 

-2voto

Romuald Brunet Points 1062

Le moyen le plus simple consiste à utiliser le caractère \r je suppose.

L'inconvénient est que vous ne pouvez pas avoir des lignes complètes, car cela efface uniquement la ligne actuelle.

Exemple simple:

 time=5
echo -n "Elapsed $time seconds"
sleep 10
time=15
echo -n "Elapsed $time seconds"

echo "\nDone"
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X