Сохранить ввод bash в верхней строке экрана

12

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

Как мне этого добиться?

Том Прайс
источник
6
Итак, если вы catфайл, это будет обратный порядок?
хаос
Нет, но я бы хотел, чтобы порции выходных данных были сдвинуты вниз
Том Прайс
1
bashне может сделать это, потому bashчто даже не знает о позициях экрана: он просто записывает в выходной файл. Вам понадобится эмулятор терминала, который знает об bashинтерактивной подсказке, чтобы знать, когда переустанавливать курсор и когда прокручивать окно.
Чепнер
Спасибо @chepner, я снова рассматриваю эту проблему, и ваш комментарий заставил меня взглянуть за пределы bash и начать смотреть на весь стек дисплея. Я хочу остаться в текстовых виртуальных консолях (то есть без X Windows), поэтому я бы пока избегал эмуляторов терминалов, но для моих сеансов с графическим интерфейсом я непременно это выясню. В случае, если кто-нибудь сталкивается с этим вопросом, я думаю, что это связано с tty, и я в настоящее время ищу здесь вдохновение ... linusakesson.net/programming/tty
Том Прайс

Ответы:

7

Добавьте эти строки в ваш .bashrc:

prompt_on_top() {
  tput cup 0 0
  tput el
  tput el1
}

pre_cmd() {
  if [ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] || [ -n "$COMP_LINE" ]; then
    return
  fi
  printf "\33[2J"
}

PROMPT_COMMAND="prompt_on_top"
trap 'pre_cmd' DEBUG

bashиметь PROMPT_COMMAND , который удерживает команду, будет выполнена перед bashприглашением показа. Здесь мы устанавливаем его в функцию prompt_on_top, которая использует tput для установки курсора в верхней части экрана.

bashтакже есть способ выполнить команду перед выполнением любой команды, используя trap для обработки сигнала DEBUG. Здесь мы устанавливаем его в функцию pre_cmd, которая будет очищать старый экран и ничего не делать, если мы сделали завершение ( COMP_LINE не пусто) или запустили команду BASH_PROMPT.


У этого подхода есть ограничение: если вывод команды слишком длинный и не помещается на экране, вывод будет переопределен prompt_on_topдействием. В этом случае вам нужно передать вывод на пейджер, чтобы прочитать весь вывод.

cuonglm
источник
1
Спасибо за ваш хорошо объясненный ответ, мне есть о чем почитать и узнать. Я проверил ваш скрипт, и в настоящее время он эффективно стирает старый вывод с экрана между командами. Я хотел бы сохранить предыдущие выходные данные на экране, под приглашением, и иметь их так, чтобы новые выводы вставлялись между приглашением и старым выводом, таким образом выталкивая старый вывод вниз на экран.
Том Прайс
Для тех, кто приходит сюда через веб-поиск, этот код github.com/swirepe/alwaysontop также «держит приглашение bash в верхней части экрана», а также несколько других функций. Тем не менее, он не отвечает на исходный вопрос: более старые выходные команды удаляются, как и в коде cuonglm.
WillC
Другим недостатком этого решения является то, что у вас нет отзывов о том, какая команда была выполнена в последний раз. То есть cat fileбудет показывать fileконтент, но вы не получите немедленной обратной связи о точном выполнении команды. В идеале за подсказкой следует невыполненная + расширенная версия выполненной команды, за которой следует вывод std.
психослав