Podczas biegania
top -n1 | head
kursor terminala znika. Bieganie top -n1
to przywraca.
Testowany w gnome-terminal
i tilix
w Ubuntu 16.04 i CentOS 7.5.
Uruchomienie top -n1 | tail
nie ma tego problemu, więc myślę, że coś na końcu top
wyjścia pozwala na ponowne pojawienie się kursora, który nie jest wykonywany podczas drukowania head
jedynego.
Co to powoduje i jak mogę bardziej elegancko przywrócić kursor?
terminal
gnome-terminal
top
cursor
pLumo
źródło
źródło
tput cnorm
. ( via )Odpowiedzi:
Nie byłem w stanie odtworzyć tego zachowania wszędzie, ale pojawia się ono na Ubuntu 18.04
Pouczające jest sprawdzenie zrzutów szesnastkowych najwyższego wyjścia:
W szczególności początkowe sekwencje
0x1b5b3f
są sekwencjami ucieczkowymi ANSI , które skutecznie są metadanymi do kontrolowania takich pozycji, jak pozycja kursora i kolor tekstu.W szczególności, na początku pierwszego wiersza najwyższego wyniku, jest
ESC [?25l
, a pod koniec ostatniego wiersza jestESC [?25h
. Zgodnie ze stroną wikipedii są to odpowiednie kody do ukrywania i pokazywania kursora.Przesyłając dane
top -n1
wyjściowe dohead
, terminal otrzyma polecenie ukryj kursor na początku, ale nie polecenie pokaż kursor na końcu, a zatem kursor pozostanie niewidoczny, dopóki inne czynności nie włączy go ponownie.Sugestia @MrShunz, aby użyć tej
-b
opcji,top
jest odpowiednia. Ta opcja wyłącza wszystkie sekwencje specjalne ANSI w wynikach top, zamiast tego wyświetla zwykły tekst do wydruku ASCII. Brak kursory zostaną skrzywdzone podczas wykonywaniatop
z-b
:źródło
printf \\033[?25l
celu ukrycia iprintf \\033[?25h
ponownego wyświetlenia kursora. Inne sekwencje specjalne[H
i[2J
wyczyść terminal (porównajclear | xxd
)Najlepszym sposobem IMHO jest
top
użycie trybu „wsadowego” (-b
flaga), który ma być używany z nieinteraktywnymi przypadkami użycia, takimi jak przesyłanie potoków do innego programu lub pliku.Więc to
nie opuści powłoki bez kursora.
Jeśli chodzi o to, dlaczego kursor znika ...
Ponieważ
top
jest to program interaktywny, „miesza się” z terminalem w celu przechwytywania danych wejściowych, przewijania zawartości itp. I ukrywa kursor.Po zakończeniu musi przywrócić kursor i stan wyświetlania, który znalazł przed wywołaniem, i robi to, wysyłając jeden lub więcej kodów sterujących do samego terminala.
Po przesłaniu polecenia
head
ten kod sterujący nie przejdzie (head
domyślnie wypisuje tylko pierwsze 10 wierszy, a dane wyjściowe obutop
kodów sterujących i przywracających stan terminala są zawsze> 10 wierszy).W rzeczywistości, jeśli podasz
head
wystarczającą liczbę wierszy do wydrukowania, pojawi się kursor!Na przykład,
pozostawia kursor w moim systemie.
źródło
-b
jest dla mnie sposobem.