Salut Tigriss.
Il y a plusieurs choses pour la jauge :
1. Détection du nombre de colonnes du terminal :
COLUMNS=$( stty -a | head -n 1 | awk '{print $7}' | rev | cut -b 2- | rev )
stty -a te fournit des infos sur le terminal, seul le 7e champ de la première ligne est intéressant, et pour avoir tous les caractères sauf le dernier (un point-virgule), j'inverse, je coupe à partir du 2e caractère et je réinverse.
(Détail 🙂
$ stty -a
speed 38400 baud; rows 70; columns 179; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V;
flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl -ixon -ixoff -iuclc -ixany -imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke
$ stty -a | head -n 1
speed 38400 baud; rows 70; columns 179; line = 0;
$ stty -a | head -n 1 | awk '{print $7'}
179;
$ stty -a | head -n 1 | awk '{print $7'} | rev
;971
$ stty -a | head -n 1 | awk '{print $7'} | rev | cut -b 2-
971
$ stty -a | head -n 1 | awk '{print $7'} | rev | cut -b 2- | rev
179
2. On enlève un certain nombre (en l'occurence, 2 pour les extrémités |===|, 1 pour une espace après, 4 pour le "Done" et 1 pour le point après Done, ce qui fait
COLS=$((${COLUMNS} -${#FINISHED} - 5))
${#VAR} fournit la longueur de la variable, en l'occurrence DONE
3. J'ai une fonction "multiecho" qui permet de répéter un caractère. Soit un égal, soit une espace, soit un retour arrière en l'occurrence.
function multiecho(){
for i in $(seq 1 $1)
do
echo -n -e "$2"
done
}
elle s'appelle comme suit : « multiecho 15 "Toto" »
ça affiche "TotoTotoTotoTotoTotoTotoTotoTotoTotoTotoTotoTotoTotoTotoToto"
4. J'ai un caractère ASCII permettant de faire un retour en arrière (voir man ascii) : c'est le caractère \010 ou \b ou \x08 ; il faut appeler echo avec l'option -e pour que ça supporte ces caractères. À noter qu'il ne faut jamais retourner à la ligne : il faut appeler echo avec l'option -n à chaque fois. Il faut noter aussi qu'un retour en arrière permet uniquement de déplacer le curseur, PAS d'effacer le caractère courant : tu peux pour cela envoyer "\010 \010" (retour arrière, espace, retour arrière)
5. Ma variable $KILLLINE est composée de plein de retours arrière, suffisamment pour retourner en début de ligne. Je n'efface rien car je n'en ai pas besoin : ma jauge ne descendra jamais.
6. Au début, je dessine la jauge (les deux extrémités).
Dans la boucle, j'envoie $KILLLINE, je redessine la première extrémité et dessine autant de = qu'il le faut (en fonction de valeurs que je récupère, et je fais une bête règle de trois avec le nombre de colonnes).
Pour éviter la division par 0 dans les tailles de fichiers, j'ai pris le soin de rajouter 1 à chaque taille : ça ne fausse pas beaucoup l'affichage 🙂
Benoit