При беге
top -n1 | head
курсор терминала исчезает. Бег top -n1
возвращает это.
Протестировано в gnome-terminal
и tilix
в Ubuntu 16.04 и CentOS 7.5.
Запуск top -n1 | tail
не имеет этой проблемы, так что я думаю, что-то в конце top
вывода позволяет появиться курсору, который не выполняется при печати head
только.
Что вызывает это и как я могу вернуть курсор более элегантно?
terminal
gnome-terminal
top
cursor
pLumo
источник
источник
tput cnorm
. ( через )Ответы:
Я не смог воссоздать это поведение везде, но оно появляется в Ubuntu 18.04
Поучительно изучить шестнадцатеричные дампы верхнего вывода:
В частности, начальные последовательности
0x1b5b3f
- это escape-последовательности ANSI , которые по сути являются метаданными для управления такими вещами, как положение курсора и цвет текста.В частности, ближе к началу первой строки верхнего вывода есть
ESC [?25l
, а к концу последней строки естьESC [?25h
. Согласно странице википедии, это соответствующие коды, чтобы скрыть и показать курсор.Путем передачи
top -n1
выводаhead
в терминал терминал получит команду скрытия курсора в начале, но не команду show-cursor в конце, и, следовательно, курсор останется невидимым, пока какое-либо другое действие не включит его снова.@MrShunz предложение использовать
-b
опциюtop
правильно. Эта опция отключает все escape-последовательности ANSI в выводе top, вместо этого просто выводит простой печатный текст ASCII. Никакие курсоры не будут повреждены во время выполненияtop
с-b
:источник
printf \\033[?25l
чтобы скрыть иprintf \\033[?25h
снова открыть курсор. Другие escape-последовательности[H
и[2J
очистка терминала (сравнитеclear | xxd
)IMHO, лучший способ -
top
использовать «пакетный» режим (-b
флаг), который предназначен для использования с неинтерактивными сценариями использования, такими как передача в другую программу или в файл.Итак, это
не оставит оболочку без курсора.
Что касается того, почему курсор исчезает ...
Поскольку
top
это интерактивная программа, она «портит» терминал, чтобы захватить ввод, прокрутить содержимое и т. Д., И скрывает курсор.При завершении он должен восстановить курсор и состояние дисплея, которые он нашел перед вызовом, и делает это путем отправки одного или нескольких управляющих кодов на сам терминал.
При передаче команды через
head
этот код управления не будет проходить (head
по умолчанию печатаются только первые 10 строк, а выходные данные обоихtop
кодов и кодов управления для восстановления состояния терминала всегда> 10 строк).Фактически, если вы дадите
head
достаточно строк для печати, появится курсор!Например,
оставляет курсор в моей системе.
источник
-b
это путь для меня.