Ao executar
top -n1 | head
o cursor do terminal desaparece. Correr top -n1
traz de volta.
Testado em gnome-terminal
e tilix
no Ubuntu 16.04 e CentOS 7.5.
A execução top -n1 | tail
não tem esse problema, então eu 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 recuperar o cursor com mais elegância?
terminal
gnome-terminal
top
cursor
pLumo
fonte
fonte
tput cnorm
. ( via )Respostas:
Não consegui recriar esse comportamento em qualquer lugar, mas ele aparece no Ubuntu 18.04
É instrutivo examinar dumps hexadecimais da saída superior:
Em particular, as sequências iniciadas
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 de saída superior, existe
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 @Shrzz de usar a
-b
opçãotop
está correta. Esta opção desativa todas as seqüências de escape ANSI na saída superior, apenas produzindo texto imprimível ASCII simples. Nenhum cursor será prejudicado durante a execução detop
com-b
:fonte
printf \\033[?25l
para ocultar eprintf \\033[?25h
revelar o cursor novamente. As outras sequências de escape[H
e[2J
limpar o terminal (compararclear | xxd
)A melhor maneira do IMHO é
top
usar o modo "lote" (-b
sinalizador) que se destina a ser usado com casos de uso não interativos, como canalização para outro programa ou 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 entradas, rolar conteúdo, etc., e oculta o cursor.Ao finalizar, é necessário restaurar o cursor e o status de exibição encontrado antes de ser chamado, enviando um ou mais códigos de controle para o próprio terminal.
Ao canalizar o comando
head
, esse código de controle não será aprovado (head
imprime apenas as 10 primeiras 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).De fato, se você der
head
linhas suficientes para imprimir, o cursor aparecerá!Por exemplo,
deixa um cursor no meu sistema.
fonte
-b
é o caminho a percorrer para mim.