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.
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.
cat
plik, byłby odwrócony porządek?bash
nie może tego zrobić, ponieważbash
nawet nie wie o pozycjach ekranu: po prostu zapisuje do pliku wyjściowego. Potrzebny byłby emulator terminala, który wie obash
interaktywnym pytaniu, aby wiedzieć, kiedy zresetować kursor, a kiedy przewinąć okno.Odpowiedzi:
Dodaj te linie do
.bashrc
:bash
mają PROMPT_COMMAND , które wstrzymują polecenie zostaną wykonane przedbash
wyświetleniem monitu. Tutaj ustawiamy go na funkcjęprompt_on_top
, która używa tput do ustawienia kursora na górze ekranu.bash
mają również sposób na wykonanie polecenia przed wykonaniem dowolnego polecenia, używając pułapki do obsługi sygnałuDEBUG
. 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 polecenieBASH_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_top
akcję. W takim przypadku musisz przesłać dane wyjściowe do pagera, aby odczytać całe dane wyjściowe.źródło
cat file
że pokażefile
zawartość, 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.