Sobrescrever a saída do terminal de um comando bash que possui saída em várias linhas?

0

Eu tenho um comando bash que quero executar uma vez por segundo e manter a saída exibida na tela. Eu poderia fazer algo como o seguinte:

while "true"; do foo; sleep 1; done

mas isso cria rolagem perturbadora. Como alternativa, eu poderia fazer o seguinte:

while "true"; do clear; foo; sleep 1; done

mas isso faz com que a saída pisque conforme é apagada e gravada. Existe uma boa maneira de fazer com que a saída do comando substitua o que está no terminal?

jonderry
fonte

Respostas:

5

Dê uma olhada no comando watch; algo como

assistir-1 foo

Neal
fonte
-bash: watch: command not found.; man watch: No manual entry for watch.
Daniel Beck
Parece que deve ser o que eu quero, mas a saída está errada. A primeira chamada ao comando pelo relógio produz uma boa saída e, a cada chamada adicional, a saída fica cada vez mais confusa. O alinhamento piora progressivamente até que eu não consigo mais ler. EDIT : estranhamente, se eu redimensionar a janela do terminal, a saída é boa novamente, mas ainda continua a degradar a cada chamada que passa.
precisa saber é o seguinte
Parece que há alguma saída stderror que pode criar esse problema (estou executando watch sudo jmap -heap <pid>, que começa com quatro linhas de saída stderror). Se eu anexar 2> /dev/nullao comando fora do relógio, isso retira a saída. No entanto, anexar 2> /dev/nullfaz com que a saída fique confusa e faltando linhas.
jonderry
@ jonderry: Eu realmente não posso ajudar, porque eu nunca tive o problema, mas você pode tentar canalizar a saída do seu comando para o gato, em seguida, assistir seria lidar com coisas "de gato" que podem ser mais fáceis de lidar, ou seja, assistir foo | cat
Neal
@ Daniel: Qual sistema operacional você está usando? Acabei de experimentar os três sistemas operacionais Linux (Opensuse, Fedora e SystemRescueCD) aqui e todos eles o instalam - e, tanto quanto me lembro, ainda não o instalei.
Neal