Курсор зникає при запуску `top -n1 | голова`


11

При бігу

top -n1 | head

курсор термінала зникає. Біг top -n1повертає його назад.

Тестували в gnome-terminalі tilixв Ubuntu 16.04 та CentOS 7.5.


Запуск top -n1 | tailне має цієї проблеми, тому я думаю, що щось наприкінці topвиводу дозволить курсору з’явитися знову, що не виконується під час друку headлише.

Що є причиною цього і як я можу повернути курсор більш елегантно?


1
Я також можу повернути це бігом tput cnorm. ( через )
pLumo

Відповіді:


5

Мені не вдалося відтворити цю поведінку скрізь, але вона виявляється на Ubuntu 18.04


Повчально досліджувати шістнадцяткові відвали верхнього випуску:

$ top -n1 | head -n1 | xxd
00000000: 1b5b 3f31 681b 3d1b 5b3f 3235 6c1b 5b48  .[?1h.=.[?25l.[H
00000010: 1b5b 324a 1b28 421b 5b6d 746f 7020 2d20  .[2J.(B.[mtop - 
00000020: 3133 3a34 333a 3034 2075 7020 3120 6d69  13:43:04 up 1 mi
00000030: 6e2c 2020 3120 7573 6572 2c20 206c 6f61  n,  1 user,  loa
00000040: 6420 6176 6572 6167 653a 2030 2e38 312c  d average: 0.81,
00000050: 2030 2e35 342c 2030 2e32 321b 2842 1b5b   0.54, 0.22.(B.[
00000060: 6d1b 5b33 393b 3439 6d1b 2842 1b5b 6d1b  m.[39;49m.(B.[m.
00000070: 5b33 393b 3439 6d1b 5b4b 0a              [39;49m.[K.
$ top -n1 | tail -n1 | xxd
00000000: 1b5b 3f31 326c 1b5b 3f32 3568 1b5b 4b    .[?12l.[?25h.[K
$ 

Зокрема, послідовності, що починаються, - 0x1b5b3fце послідовності відходу ANSI , які фактично є метаданими для керування такими речами, як положення курсору та колір тексту.

Зокрема, до початку першого рядка верхнього виходу є ESC [?25l, а до кінця останнього рядка є ESC [?25h. Відповідно до сторінки вікіпедії, це відповідні коди, щоб сховати та показати курсор.

Передаючи top -n1висновок до head, термінал отримає команду приховати курсор на початку, але не команду show-cursor в кінці, і, отже, курсор залишиться невидимим, доки інша дія не включиться знову.

@MrShunz Пропозиція використовувати -bпараметр " Увімкнено" top. Цей параметр вимикає всі послідовності виходу ANSI у вихідному топі, замість цього просто виводить звичайний текст для друку ASCII. Ніякі курсори не завдадуть шкоди під час виконання topз -b:

$ top -b -n1 | head -n1 | xxd
00000000: 746f 7020 2d20 3133 3a35 393a 3236 2075  top - 13:59:26 u
00000010: 7020 3138 206d 696e 2c20 2031 2075 7365  p 18 min,  1 use
00000020: 722c 2020 6c6f 6164 2061 7665 7261 6765  r,  load average
00000030: 3a20 302e 3134 2c20 302e 3036 2c20 302e  : 0.14, 0.06, 0.
00000040: 3037 0a                                  07.
$ 

Чудова відповідь, дякую. Поведінку можна відтворити, printf \\033[?25lщоб приховати та printf \\033[?25hзнову розкрити курсор. Інші послідовності втечі [Hі [2Jочистити термінал (порівняйте clear | xxd)
pLumo

17

Найкращим способом IMHO є topвикористання "пакетного" режиму ( -bпрапор), який призначений для використання у випадках неінтерактивного використання, таких як трубопроводи до іншої програми або файлу.

Отже, це

top -n1 -b | head

не залишить оболонку без курсору.

Щодо того, чому курсор зникає ...

Оскільки topце інтерактивна програма, вона "псується" з терміналом, щоб захопити вхід, прокрутити вміст тощо, і приховає курсор.

Після закінчення він повинен відновити курсор і стан відображення, який він знайшов до виклику, і це робиться шляхом надсилання одного або декількох контрольних кодів до самого терміналу.

Проводячи команду через headцей код, цей керуючий код не пройде ( headдрукується лише перші 10 рядків за замовчуванням, а вихід topі керуючих кодів для відновлення стану терміналу завжди> 10 рядків).

Насправді, якщо ви дасте headдостатньо рядків для друку, з'явиться курсор!

Наприклад,

top -n1 | head -n 100

залишає курсор у моїй системі.


Дякую за вашу відповідь. Використання -b- це шлях для мене.
pLumo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.