курсор исчезает При запуске `Top -n1 | голова`

Как насчет:

find . -mtime -1 -name "fileprefix*" -exec sh -c \
'echo "$(grep 'search string' $1 | tail -n 1),$1"' _ {} \;

Приведенный выше вывод дает вам хороший результат с последним появлением строки поиска в каждом файле, за которым следует соответствующее имя файла после запятой (измените часть ", $ 1" под эхом, чтобы изменить форматирование или удалите его, если в этом нет необходимости). Пример вывода, который ищет строку поиска «10» в файлах с префиксом имени «файл», выглядит следующим образом:

[dmitry@localhost sourceDir]$ find . -mtime -1 -name "file*" -exec  sh -c 'echo "$(grep '10' $1 | tail -n 1),$1"' _ {} \;
Another data 02 10,./file02.log
Some data 01 10,./file01.log
Yet another data 03 10,./file03.log 
11
18.09.2018, 13:52
2 ответа

Мне не удалось воспроизвести это поведение везде, но оно присутствует в 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терминал будет получать команду скрытия курсора -в начале, но не команду показа курсора -в конце, и, следовательно, курсор останется невидимым. пока какое-то другое действие не включит его снова.

@MrShunz предлагает использовать вариант -bдля topправильно. Эта опция отключает все управляющие последовательности ANSI в выходных данных top, вместо этого просто выводится обычный печатный текст 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.
$ 
6
27.01.2020, 19:57

Лучший способ, ИМХО, состоит в том, чтобы заставить topиспользовать «пакетный» режим(-bфлаг ), который предназначен для использования с не -интерактивными вариантами использования, такими как передача в другую программу или в файл.

Итак, это

top -n1 -b | head

не покидает оболочку без курсора.

Насчет почему пропадает курсор ...

Так как topявляется интерактивной программой, она "возится" с терминалом, чтобы получить ввод, прокрутить содержимое и т.д., и она скрывает курсор.

При завершении он должен восстановить курсор и состояние дисплея, которое он обнаружил до вызова, и он делает это, отправляя один или несколько управляющих кодов самому терминалу.

При передаче команды через headэтот управляющий код не пройдет через(headпо умолчанию печатаются только первые 10 строк, а вывод как top, так и управляющих кодов для восстановления состояния терминала: всегда >10 строк ).

На самом деле, если вы дадите headдостаточно строк для печати, появится курсор!

Например,

top -n1 | head -n 100

оставляет курсор в моей системе.

17
27.01.2020, 19:57

Теги

Похожие вопросы