Ao correr
top -n1 | head
o cursor do terminal desaparece. Correr top -n1
traz de volta.
Testado no Ubuntu 16.04 e CentOS 7.5 gnome-terminal
.tilix
A execução top -n1 | tail
não tem esse problema, então acho que algo no final da top
saída deixa o cursor reaparecer, o que não é executado ao imprimir o head
único.
O que causa isso e como posso voltar o cursor de forma mais elegante?
A melhor maneira de IMHO é
top
usar o modo "lote" (-b
flag) que se destina a ser usado com casos de uso não interativos, como canalização para outro programa ou para um arquivo.Então, é isso
não sairá do shell sem um cursor.
Quanto ao motivo pelo qual o cursor desaparece ...
Como
top
é um programa interativo, ele "mexe" com o terminal para pegar entrada, rolar conteúdo, etc, e oculta o cursor.Ao finalizar, deve-se restaurar o cursor e o status de exibição que encontrou antes de ser chamado, e o faz enviando um ou mais códigos de controle para o próprio terminal.
Ao canalizar o comando por meio
head
de , esse código de controle não será transmitido (head
imprime apenas as primeiras 10 linhas por padrão, e a saída de ambostop
e dos códigos de controle para restaurar o estado do terminal é sempre > 10 linhas).Na verdade, se você der
head
linhas suficientes para imprimir, o cursor aparece!Por exemplo,
deixa um cursor no meu sistema.
Não consegui recriar esse comportamento em todos os lugares, mas ele aparece no Ubuntu 18.04
É instrutivo examinar os dumps hexadecimais da saída superior:
Em particular, as sequências que iniciam
0x1b5b3f
são sequências de escape ANSI , que efetivamente são metadados para controlar coisas como a posição do cursor e a cor do texto.Em particular, no início da primeira linha da saída superior, há
ESC [?25l
, e no final da última linha éESC [?25h
. De acordo com a página da wikipedia, estes são os respectivos códigos para ocultar e mostrar o cursor.Ao canalizar a
top -n1
saída parahead
, o terminal receberá o comando hide-cursor no início, mas não o comando show-cursor no final e, portanto, o cursor permanecerá invisível até que alguma outra ação o ligue novamente.A sugestão do @MrShunz para usar a
-b
opçãotop
está correta. Esta opção desativa todas as seqüências de escape ANSI na saída do top, em vez de apenas produzir texto imprimível ASCII simples. Nenhum cursor será prejudicado durante a execução detop
com-b
: