GNU Watch: выровнять в левом нижнем углу терминала - PullRequest
4 голосов
/ 20 января 2012

Я хочу применять команду наблюдения к запросу MySQL каждые N секунд, но хотел бы, чтобы результаты отображались в левом нижнем углу терминала, а не в левом верхнем:

watch -n 120 "mysql_query" | column -t"

Показывает мои результатывот так:

--------------------------
|xxxxxxxxxxx             |
|xxxxxxxxxxx             |
|xxxxxxxxxxx             |
|                        |
|                        |
--------------------------

Принимая во внимание, что я хотел бы, чтобы у них было так:

--------------------------
|                        |
|                        |
|xxxxxxxxxxx             |
|xxxxxxxxxxx             |
|xxxxxxxxxxx             |
--------------------------

Предложение?

Ответы [ 2 ]

3 голосов
/ 20 января 2012

Я не вижу прямого способа сделать это, но мне удалось заставить его работать, используя следующий подход. Я не полностью проверил это, поэтому я не могу гарантировать, что это будет работать во всех ситуациях.

Используя этот скрипт:

#!/bin/bash
TERM_HEIGHT=`tput lines`  # determine terminal height
WATCH_BANNER_HEIGHT=2  # account for the lines taken up by the header of "watch"
let VIS_LINES="TERM_HEIGHT - WATCH_BANNER_HEIGHT"  # height of visible area
(yes " " | head -n $VIS_LINES; cat | head -n $VIS_LINES) | tail -n $VIS_LINES

Постобработка вывода вашей команды так, как она вызывается watch например. (при условии, что скрипт был сохранен как align_bottom, сделан исполняемым и сохранен где-то внутри вашего $PATH):

watch -n 120 "mysql_query | column -t | align_bottom"

Что делает скрипт:

  1. Определить высоту (количество строк) терминала
  2. Рассчитать видимую область watch вывода
  3. Печать пустых строк для заполнения вывода (нажатие вывода вниз)
  4. Считайте вывод из stdin и обрежьте его так, чтобы мы отображали только верхнюю часть вывода, если она выходит за пределы экрана. Если вы хотите увидеть нижнюю часть вывода, просто удалите команду head после cat.
  5. tail выходные данные шагов (3) и (4), поэтому избыточное заполнение удаляется, и окончательный выходной сигнал плотно вписывается в watch

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


Обновление:

Также должно быть возможно реализовать это как функцию, просто чтобы она могла удобно сидеть в .bashrc.

function align_bottom() {
  (( VIS = $(tput lines) - 2 ))  # height of visible area
  (yes " " | head -n $VIS; cat | head -n $VIS) | tail -n $VIS
}
typeset -fx align_bottom  # !! make it callable from subshell

Использование будет таким же:

watch -n 120 "mysql_query | column -t | align_bottom"

Обратите внимание, что watch запускает данную команду, используя sh -c, поэтому, как указал Деннис в комментариях, в системах, которые не связывают /bin/sh с /bin/bash, функциональный подход, показанный выше, не будет работать.

Можно заставить работать нормально:

watch -n 120 "mysql_query | column -t | bash -c align_bottom"

но для мобильности и удобства использования проще использовать подход сценария оболочки.

1 голос
/ 20 января 2012

Я не знаю, сможет ли watch сделать это, но я бы использовал другой инструмент, чтобы иметь несколько терминалов и изменил размер того, в котором работает watch, в соответствии с моими потребностями.

Вот несколько полезных инструментов:

Надеюсь, это поможет.

...