Fai in modo che "sudo apt-get update" restituisca solo ciò che sta facendo su una riga

4

Voglio sudo apt-get update per riportare cosa sta facendo su una singola riga piuttosto che riempire la finestra del terminale con il suo output. Non voglio nascondere possibili messaggi di errore, però.

Intendo qualcosa di simile, ma scrivendo l'ultima riga che cambia e non è visibile dopo quella nell'output di sudo apt-get update :

sudo apt-get update | xargs -I{} printf '%-*s\r' $(tput cols) "{}"
printf '\n

Sarebbe anche bello, se potesse scrivere un determinato numero di linee, e scorrere quelle linee senza nascondere il testo che precede il suo output nella finestra del terminale.

    
posta jarno 14.12.2016 - 08:12

1 risposta

1

Questo sarà difficile da fare senza scrivere una corretta applicazione che usi ncurses o simili per controllare il terminale. Con bash, puoi ottenere alcuni di questi effetti con il seguente script:

#! /bin/bash
height=${1:-5}

# Buffer up to the height
do_height()
{
    for ((i = 0; i < height; i++))
    do
        "[email protected]"
    done
}

do_height printf "%-${cols}s\n" ""

# Get dimensions of terminal
cols=$(tput cols)
lines=$(tput lines)

sudo apt-get update |&
    while IFS= read -r line
    do 
        sleep 0.01
        if [[ $line =~ ^(Hit|Get|Fetch|Read) ]]
        then
            out=("$line" "${out[@]:0:4}")
        else
            out=("" "${out[@]:0:4}")
            tput cup $((lines - height - 1)) 0
            printf "%-${cols}s\n" "$line"
            do_height printf "%-${cols}s\n" ""
        fi
        tput cup $((lines - height - 1)) 0
        for ((i = height - 1; i >= 0; i--))
        do
            printf "%-${cols}s\n" "${out[i]}"
        done
    done

Esegui come foo.sh N dove N è il numero di linee che vuoi mantenere. Nota che:

  • questo presuppone che tu sia nella parte inferiore del terminale.
  • errori verranno sempre stampati N righe sopra l'ultima riga.
  • apt-get fornisce più output transienti quando stampa su un terminale, quindi l'output qui sembrerà a scatti perché le linee intermedie non sono disponibili.

Quindi l'output finale sarà simile a:

    
risposta data muru 08.03.2017 - 12:18

Leggi altre domande sui tag