Тримайте введення bash у верхньому рядку екрана


12

Я хотів би зберегти bashкомандний рядок у верхній частині екрана, щоб виходи із старих команд висувалися вниз, а не вгору.

Як я можу цього досягти?


6
Отже, якщо ви маєте catфайл, це було б змінити порядок?
хаос

Ні, але я хотів би, щоб шматки продукції були відсунуті вниз
Том Ціна,

1
bashне може цього зробити, тому bashщо навіть не знає про положення екрана: він просто записує у вихідний файл. Вам знадобиться емулятор терміналу, який знає про bashінтерактивний рядок, щоб знати, коли потрібно скинути курсор і коли прокрутити вікно.
чепнер

Дякую @chepner, я переглядаю цю проблему, і ваш коментар змусив мене зазирнути за межі bash і почати роздивлятися весь стек дисплея. Я хочу залишатися в рамках текстових віртуальних консолей (тобто немає X Windows), тому я зараз уникаю емуляторів терміналів, але для моїх сеансів GUI я, безумовно, вивчу це. Якщо хтось стикається з цим питанням, я гадаю, що це стосується 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також є спосіб виконати команду перед виконанням будь-якої команди, використовуючи пастку для обробки сигналу DEBUG. Тут ми встановимо його на функцію pre_cmd, яка очистить старий екран, і нічого не зробимо, якщо ми виконали завершення ( COMP_LINE не порожній) або запустимо команду в BASH_PROMPT.


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


1
Дякую за вашу добре пояснену відповідь, мені є багато чого читати і вчитися. Я перевірив ваш сценарій, і в даний час він ефективно видаляє старий вихід з екрана між командами. Я хотів би зберегти попередні виходи на екрані, під підказкою, і мати так, щоб нові виходи вставлялися між підказкою та старим висновком, тому висуваючи старий вихід вниз по екрану.
Том Ціна

Для тих, хто приїжджає сюди за допомогою веб-пошуку, цей код github.com/swirepe/alwaysontop також "підтримує ваш bash-підказку у верхній частині екрана", а також ще пару функцій. Однак не відповідає на початкове запитання: старіші командні виходи видаляються, як і в коді cuonglm.
WillC

Іншим недоліком цього рішення є те, що у вас немає відгуків про те, яка команда востаннє виконувалася. Тобто, cat fileбуде показано fileвміст, але ви не отримаєте негайного відгуку про точно виконану команду. В ідеалі підказки дотримуватиметься нерозширеної + розширеної версії виконаної команди з наступним виведенням std.
psihoslave
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.