Comment afficher et mettre à jour l’écho sur la même ligne

J’ai le suivant dans Bash (Sous Linux)

for dir in Movies/* do (cd "$dir" && pwd|cut -d \/ -f5|tr -s '\n' ', ' >> ../../movielist && exiftool * -t -s3 -ImageSize -FileType|tr -s '\t' ',' >> ../../movielist ) echo "Movie $movies - $dir ADDED!" let movies=movies+1 done 

Mais je souhaite faire en sorte que le “echo” montre l’écho suivant sur la ligne suivante (pas concaténer avec la dernière sortie d’écho mais le remplacer) afin de donner l’impression qu’il est en cours de mise à jour. Semblable à la façon dont une barre de progression avec pourcentage serait affichée sur la même ligne.

Eh bien, je n’ai pas lu correctement la page de l’ man echo pour cela.

echo avait 2 options qui pourraient le faire si j’ajoutais un 3ème caractère d’échappement.

Les 2 options sont -n et -e .

-n ne sortira pas la nouvelle ligne. Cela m’évite donc d’aller à une nouvelle ligne chaque fois que je fais écho à quelque chose.

-e me permettra d’interpréter les symboles d’échappement de backslash.

Devinez quel symbole d’évasion je veux utiliser pour cela: \r . Oui, le retour de chariot me renverrait au début et il semblerait que je mets à jour sur la même ligne.

Donc, la ligne d’écho ressemblerait à ceci:

echo -ne "Movie $movies - $dir ADDED!"\\r

Je devais échapper au symbole de fuite pour que Bash ne le tue pas. c’est pourquoi vous voyez 2 symboles \ .

Comme mentionné par William, printf peut également effectuer des tâches similaires (et même plus étendues) comme celle-ci.

Si j’ai bien compris, vous pouvez le faire en remplaçant votre écho par la ligne suivante:

 echo -ne "Movie $movies - $dir ADDED! \033[0K\r" 

Voici un petit exemple que vous pouvez exécuter pour comprendre son comportement:

 #!/bin/bash for pc in $(seq 1 100); do echo -ne "$pc%\033[0K\r" sleep 1 done echo 

Le rest des réponses est plutôt bon, mais je voulais juste append quelques informations supplémentaires au cas où quelqu’un viendrait chercher une solution pour remplacer / mettre à jour un écho multiligne.

Je voudrais donc partager un exemple avec vous tous. Le script suivant a été essayé sur un système CentOS et utilise la commande “timedatectl” qui imprime des informations temporelles détaillées sur votre système.

J’ai décidé d’utiliser cette commande car sa sortie contient plusieurs lignes et fonctionne parfaitement pour l’exemple ci-dessous:

 #!/bin/bash while true; do COMMAND=$(timedatectl) #Save command result in a var. echo "$COMMAND" #Print command result, including new lines. sleep 3 #Keep above's output on screen during 3 seconds before clearing it #Following code clears previously printed lines LINES=$(echo "$COMMAND" | wc -l) #Calculate number of lines for the output previously printed for (( i=1; i <= $(($LINES)); i++ ));do #For each line printed as a result of "timedatectl" tput cuu1 #Move cursor up by one line tput el #Clear the line done done 

Ce qui précède imprimera le résultat de " timedatectl " pour toujours et remplacera l'écho précédent par des résultats mis à jour.

Je dois mentionner que ce code n'est qu'un exemple, mais peut-être pas la meilleure solution pour vous en fonction de vos besoins. Une commande similaire qui ferait presque la même chose (du moins visuellement) est " watch -n 3 timedatectl ".

Mais c'est une autre histoire. 🙂

J'espère que cela pourra aider!

Ma manière préférée s’appelle faire le sumil à 50. ici i dois utiliser la variable à l’intérieur des instructions d’écho.

 for i in $(seq 1 50); do echo -ne "$i%\033[0K\r" sleep 50 done echo "ended" 

Cela peut varier, essayez-le et changez-le si nécessaire.

 #! bin/bash for load in $(seq 1 100); do echo -ne "$load % downloded ...\r" sleep 1 done echo "100" echo "Loaded ..."