Como eu faço um comando para atualizar a si mesmo sem escrever um script .sh?

1

Eu estou fazendo esse comando para medir o uso de RAM:

while sleep 1; do free && echo -e && ps -eo rss | awk '{sum+=$1} END {print sum}' && echo -e "\n"; done

No entanto, ainda continua a imprimir novas saídas, em vez de apagar / substituir o último.

O objetivo é fazer com que esse comando se pareça com o comportamento top ou htop.

Portanto, a questão é: sem escrever um script de shell, como faço um comando para se atualizar?

Eu me deparei com isso: link

Portanto, printf "3c" funciona, mas o problema é que ele se comporta como reset, o que limpa todo o terminal, exceto a última saída.

Além disso, watch também funciona, mas sair não manterá a última saída, como o topo faz.

Existe uma maneira de misturar os dois? Como imitar o comportamento do top?

Top atualiza-se, sem redefinir todo o terminal e mantém a última saída ao sair.

    
por X.LINK 14.01.2018 / 02:21

3 respostas

2

Use o comando watch . Para executar o comando que você especificou, algo como:

watch -n 1 'free -t && echo && ps -eo rss | awk '\''{sum+=$1} END {print sum}'\'' && echo'

Preste especial atenção à citação especial em torno do comando awk necessário para colocar aspas simples entre aspas simples.

watch executa o programa em um intervalo especificado (1 segundo aqui, com o -n 1 sinalizador) e exibe a primeira tela de saída na tela, atualizando a cada vez.

Se você está definido para fazer a saída persistir depois de sair, você pode executar o comando mais uma vez no final. Algo como:

tmp='free -t && echo && ps -eo rss | awk '\''{sum+=$1} END {print sum}'\'' && echo'
watch -n 1 "$tmp" ; eval "$tmp"

Onde estou usando apenas a variável temporária $tmp para evitar digitar o comando inteiro duas vezes.

    
por 14.01.2018 / 03:12
1

Bem, se você não se importa em limpar todo o resto da janela do terminal, você pode adicionar um clear após o sono:

while sleep 1; do clear; free -t && echo -e && ps -eo rss | awk '{sum+=$1} END {print sum}' && echo -e "\n"; done
    
por 14.01.2018 / 03:01
0

Uma solução é evitar imprimir em subcomandos (como awk ) e obter tudo em variáveis e, em seguida, imprimir tudo em uma linha com um CR em vez de um LF no final (eu uso bash printf para isso):

 printf "%10s %4d %4d\r" $dev $recvdiff $senddiff
    
por 14.01.2018 / 02:46