diff --git a/code/linux/linux-mint/alpi-fiche.sh b/code/linux/linux-mint/alpi-fiche.sh index e62ce05..6b6e2ce 100755 --- a/code/linux/linux-mint/alpi-fiche.sh +++ b/code/linux/linux-mint/alpi-fiche.sh @@ -47,6 +47,10 @@ set -u +# Bash ne compte les caractères — et non les octets — que si la locale le dit. +# C'est ce qui aligne les colonnes du tableau des disques. +export LC_ALL="${LC_ALL:-C.UTF-8}" + # Le temps que met la collecte, en millisecondes. # # Une machine n'est relevée qu'une fois quand elle n'a pas connu de session @@ -247,6 +251,25 @@ BARRETTES="$BARRETTES]" TABLE_DISQUES="" +# Remplir une colonne à la bonne largeur. +# +# « printf %-10s » compte les octets, pas les caractères : « mécanique » en +# pèse dix pour neuf signes, et la colonne suivante glisse d'un cran. Bash, +# lui, sait compter les caractères quand la locale est en UTF-8 — on lui +# laisse ce travail, et l'on force la locale plutôt que d'espérer. +colonne() { + local texte="$1" largeur="$2" cote="${3:-gauche}" n + n=${#texte} + if [ "$n" -gt "$largeur" ]; then + printf '%s' "${texte:0:$largeur}" + return + fi + local blancs="" + while [ "$n" -lt "$largeur" ]; do blancs="$blancs "; n=$((n + 1)); done + if [ "$cote" = droite ]; then printf '%s%s' "$blancs" "$texte" + else printf '%s%s' "$texte" "$blancs"; fi +} + # --- Les disques ----------------------------------------------------------- # # lsblk donne la taille et le type ; le drapeau « rotational » du noyau @@ -331,10 +354,14 @@ for chemin in /sys/block/*; do else case "$usure" in ''|*[!0-9]*) ;; *) usure_dite="usé à $usure %" ;; esac fi - TABLE_DISQUES="$TABLE_DISQUES$(printf '%-7s %-20s %-10s %9s %-8s %-7s %s' \ - "$nom" "$(printf '%.20s' "${modele:-—}")" \ - "$([ "$rotatif" = 1 ] && echo mécanique || echo SSD)" \ - "$taille_go Go" "${sante:-—}" "${heures:-—}" "$secteurs")"$'\n' + TABLE_DISQUES="$TABLE_DISQUES$( + colonne "$nom" 7; printf ' ' + colonne "${modele:-—}" 20; printf ' ' + colonne "$([ "$rotatif" = 1 ] && echo mécanique || echo SSD)" 10; printf ' ' + colonne "$taille_go Go" 10 droite; printf ' ' + colonne "${sante:-—}" 8; printf ' ' + colonne "$usure_dite" 16; printf ' ' + printf '%s' "$secteurs")"$'\n' [ "$premier" = 0 ] && DISQUES="$DISQUES," premier=0 @@ -602,8 +629,14 @@ if [ "$CHECK" = 1 ]; then esac echo if [ -n "$TABLE_DISQUES" ]; then - printf " %s%-7s %-20s %-10s %9s %-8s %-7s %s%s\n" "$D" \ - "Disque" "Modèle" "Type" "Taille" "SMART" "Heures" "Secteurs R/P/I" "$Z" + printf ' %s' "$D" + colonne "Disque" 7; printf ' ' + colonne "Modèle" 20; printf ' ' + colonne "Type" 10; printf ' ' + colonne "Taille" 10 droite; printf ' ' + colonne "SMART" 8; printf ' ' + colonne "Marche / usure" 16; printf ' ' + printf 'Secteurs R/P/I%s\n' "$Z" printf '%s' "$TABLE_DISQUES" | sed "s/^/ /" printf " %sR : remplacés · P : illisibles en attente · I : perdus%s\n" "$D" "$Z" echo