Zachowaj wejście bash w górnej linii ekranu


12

Chciałbym zachować bashwejście wiersza polecenia u góry ekranu, aby dane wyjściowe starszych poleceń były przesuwane w dół, a nie w górę.

Jak mogę to osiągnąć?


6
Więc jeśli masz catplik, byłby odwrócony porządek?
chaos

Nie, ale chciałbym, aby części produkcji zostały zepchnięte w dół
Tom Price

1
bashnie może tego zrobić, ponieważ bashnawet nie wie o pozycjach ekranu: po prostu zapisuje do pliku wyjściowego. Potrzebny byłby emulator terminala, który wie o bashinteraktywnym pytaniu, aby wiedzieć, kiedy zresetować kursor, a kiedy przewinąć okno.
chepner

Dzięki @chepner, ponownie analizuję ten problem, a twój komentarz sprawił, że spojrzałem poza bash i zacząłem patrzeć na cały stos wyświetlania. Chcę pozostać w wirtualnych konsolach tekstowych (tj. Bez X-Windowsa), więc na razie unikałbym emulatorów terminali, ale na sesje GUI na pewno się tym zajmę. Na wypadek, gdyby ktoś natknął się na to pytanie, sądzę, że ma to związek z tty, a ja szukam tutaj inspiracji ... linusakesson.net/programming/tty
Tom Price

Odpowiedzi:


7

Dodaj te linie do .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

bashmają PROMPT_COMMAND , które wstrzymują polecenie zostaną wykonane przed bashwyświetleniem monitu. Tutaj ustawiamy go na funkcję prompt_on_top, która używa tput do ustawienia kursora na górze ekranu.

bashmają również sposób na wykonanie polecenia przed wykonaniem dowolnego polecenia, używając pułapki do obsługi sygnału DEBUG. Tutaj ustawiamy go na funkcję pre_cmd, która wyczyści stary ekran i nie zrobi nic, jeśli zakończymy ( COMP_LINE nie jest pusty) lub uruchomimy polecenie BASH_PROMPT.


Podejście to ma ograniczenia, jeśli wyjście komendy jest zbyt długie, aby zmieściło się na ekranie, wówczas dane wyjściowe zostaną zastąpione przez prompt_on_topakcję. W takim przypadku musisz przesłać dane wyjściowe do pagera, aby odczytać całe dane wyjściowe.


1
Dziękuję za dobrze wyjaśnioną odpowiedź. Mam dużo do przeczytania i nauki. Przetestowałem twój skrypt i obecnie skutecznie usuwa stare dane wyjściowe z ekranu między poleceniami. Chciałbym zachować poprzednie dane wyjściowe na ekranie poniżej monitu i mieć je tak, aby nowe dane wyjściowe były wstawiane między wierszem zachęty a starą wersją, co powoduje przesunięcie starej wersji w dół ekranu.
Tom Price

Dla tych, którzy przychodzą tutaj za pomocą wyszukiwania w sieci, ten kod github.com/swirepe/alwaysontop również „utrzymuje monit bash na górze ekranu”, a także kilka innych funkcji. Nie odpowiada jednak na pierwotne pytanie: starsze dane wyjściowe poleceń są usuwane, jak w kodzie cuonglm.
WillC

Inną wadą tego rozwiązania jest brak opinii na temat ostatniego polecenia. Oznacza to, cat fileże pokaże filezawartość, ale nie otrzymasz natychmiastowej informacji zwrotnej na temat dokładnie wykonanego polecenia. Idealnie byłoby, gdyby po monitie pojawiła się nierozwinięta + rozszerzona wersja wykonanego polecenia, a następnie standardowe wyjście.
psychoslave
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.