Faça a saída “sudo apt-get update” apenas o que está fazendo em uma linha

4

Eu quero que sudo apt-get update informe sobre o que está fazendo em uma única linha, em vez de preencher a janela do terminal com sua saída. Eu não quero esconder possíveis mensagens de erro, no entanto.

Quero dizer algo assim, mas escrevendo a última linha que muda e não é visível depois disso na saída de sudo apt-get update :

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

Além disso, seria bom se pudesse escrever determinado número de linhas e rolar essas linhas sem ocultar o texto que precede sua saída na janela do terminal.

    
por jarno 14.12.2016 / 08:12

1 resposta

1

Isso será difícil de fazer sem escrever um aplicativo adequado que use ncurses ou similares para controlar o terminal. Com o bash, você pode obter um pouco desse efeito com o seguinte script:

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

# Buffer up to the height
do_height()
{
    for ((i = 0; i < height; i++))
    do
        "$@"
    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

Executar como foo.sh N , onde N é o número de linhas que você deseja manter. Note que:

  • isso pressupõe que você esteja na parte inferior do terminal.
  • erros sempre serão impressos N linhas acima da última linha.
  • apt-get fornece uma saída mais transitória quando está imprimindo em um terminal, então a saída aqui parecerá espasmódica, já que as linhas intermediárias não estão disponíveis.

Assim, o resultado final será parecido com:

    
por muru 08.03.2017 / 12:18

Tags