Grâce à Dave/tripleee pour le mécanisme de base (remplacement des nouvelles lignes par des retours chariot), voici une version qui fonctionne réellement :
tar [opts] [args] | perl -e '$| = 1; while (<>) { s/\n/\r/; print; } print "\n"'
Réglage de $|
permet à perl d'effectuer un vidage automatique après chaque print
au lieu d'attendre les nouvelles lignes, et la nouvelle ligne de queue empêche votre dernière ligne de sortie d'être (partiellement) écrasée lorsque la commande se termine et que bash affiche une invite (c'est vraiment laid si c'est partiel, avec l'invite et le curseur suivis du reste de la ligne de sortie).
Ce serait bien d'accomplir cela avec tr
mais je ne sais pas comment faire pour forcer l'accès à l'information. tr
(ou tout autre standard similaire) pour vider la sortie d'état.
Edit : La version précédente est en fait moche, puisqu'elle n'efface pas le reste de la ligne après ce qui a été produit. Cela signifie que les lignes courtes qui suivent des lignes plus longues ont du texte restant. Cette solution (certes moche) corrige ce problème :
tar [opts] [args] | perl -e '$| = 1; $f = "%-" . `tput cols` . "s\r"; $f =~ s/\n//; while (<>) {s/\n//; printf $f, $_;} print "\n"'
(Vous pouvez également obtenir la largeur du terminal de manière plus perl, comme décrit ici Je ne voulais pas dépendre des modules CPAN.