Chciałbym tak skonfigurować bash, aby wykonywał polecenie clear
za każdym razem, gdy wpiszę jakieś polecenie w terminalu (przed wykonanie mojego polecenia). Jak mogę to zrobić?
Używam Debian Linux.
Komentarze
- Widzisz ten wątek jest przydatny.
- Po prostu ciekawi: o co ' ubiegasz się o to? Z wyjątkiem sytuacji, gdy ' m programy do debugowania z dużą ilością danych wyjściowych, zwykle chcę zachować jak najwięcej na ekranie, aby pomóc mi śledzić kontekst ' pracuję w.
Odpowiedź
Bash ma hak polecenia wstępnego . Rodzaj.
preexec () { clear } preexec_invoke_exec () { [ -n "$COMP_LINE" ] && return # do nothing if completing [ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return # don"t cause a preexec for $PROMPT_COMMAND local this_command=`history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//g"`; # obtain the command from the history, removing the history number at the beginning preexec "$this_command" } trap "preexec_invoke_exec" DEBUG
Komentarze
- Gilles: wkleiłem powyższe do terminala konsoli, a dane wyjściowe z każdego polecenia, które następnie wprowadziłem, zostały wyczyszczone, zanim mogłem je przeczytać. Czy coś mi brakuje? Co się stanie z tym (i inną odpowiedzią poniżej), jeśli wywołam wielowierszowy skrypt bash gdzie więcej niż jedna linia (lub dowolna linia inna niż ostatnia) generuje inter esting output?
- @Joe Powinno to wyczyścić ekran po naciśnięciu
Enter
, przed wykonaniem polecenia. U mnie tak to działa. Haczyk preexec jest wykonywany dla każdego polecenia interaktywnego, nie ' nie ma znaczenia, czy polecenie jest poleceniem wbudowanym, czy zewnętrznym, czy też wieloma poleceniami. - @ Joe, musisz dodać tę linię poniżej, nie rób nic, jeśli zakończono
[ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return;
problem polega na tym, że PROMPT_COMMAND jest uruchamiany i również jest uwięziony po wykonaniu polecenia; Czy ktoś może mi też powiedzieć, dlaczegolocal this_command=`history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//g"`;
jest tutaj? - @JamesAndino
history -1
wyświetla ostatnią linię poleceń z numer historii z przodu. Filtr sed usuwa numer historii. - @JamesAndino To sprawiło, że zadziałało (i widzę, że Giles dodał to do swojej odpowiedzi).
Odpowiedź
bind "RETURN: "\e[1~clear; \e[4~\n""
Po tym za każdym razem, gdy naciskasz return zamiast po prostu pisać \n
przesunie się na początek wiersza, wprowadź tekst clear;
, a następnie przejdziesz na koniec i wpisz \n
zgodnie z oczekiwaniami.
Komentarze
- Nowa linia powoduje wypisanie zachęty i tak, więc umieszczenie w niej wyraźnego znaku prowadzi do tego samego bez zanieczyszczania historii poleceń poleceniami
clear
. - @ jw013 Różnica polega na tym, że w moim przypadku
clear
jest wykonywane, zanim polecenie i wyjście polecenia nie ' t znikają. Jednak w przypadku zachęty tak. - Chciałbym, żeby był jakiś sposób na zrobienie tego bez konieczności modyfikowania samego wiersza poleceń – ' m na pewno tak łamać w interesujący sposób w złożonych lub wieloliniowych poleceniach, ale nie mogę ' znaleźć lepszego sposobu, aby to zrobić.
- @ jw013, masz rację, to nie psuje się dla wielu wierszy .. Wstawia
clear;
do wyjścia dla każdego dodatkowego\n
. - ta wskazówka jest bardzo dobry dzięki !! Musiałem powiązać jakiś konkretny kod z F2, ale czasami linia zawiera polecenie, które wpisałem, ale nie zostało wykonane, więc w tym przypadku:
bind "\"\\eOQ\":\"\e[1~ls;#\\n\""
przesunie się na początek, wpiszls;#
komentując to, co tam było, i poprawnie uruchom poleceniels
! thx!
Odpowiedź
z pytania, które zadałem dzisiaj (z uznaniem dla użytkownika odpowiedź @aecolley” ):
bind ""\C-m": "\C-l\C-j""
\C-m
symulacja klawisz „Enter”, \C-l
symulujący Ctrl+l
tak, jak jest czysty, a \C-j
to „nowa linia i wcięcie”, więc polecenie wiąże klawisz Enter z Ctrl + l & Ctrl + j
, który działa na GNU bash, wersja 3.2.53 (1) -release (x86_64-apple-darwin14), a inne odpowiedzi w tym wątku nie. również, nie zanieczyszcza to historii poleceniami „wyczyść” co inne polecenie.
Komentarze
- uwaga: jeśli używasz over ssh, musisz go uruchomić w takim środowisku, inaczej zdarzy się dziwna rzecz.
- witaj działa na moim terminalu ubuntu 16.04, dzięki, ale jak to działa, czy możesz podać link lub jakąś dokumentację?
Odpowiedź
Rozważ czyszczenie tylko wtedy, gdy chcesz
cb4() { preexec () { clear } }
Używa haka o nazwie preexec
, potwierdzony działa również z zsh
Następnie każda sesja, którą chcesz automatycznie wyczyścić przed każdym uruchomionym poleceniem : cb4
Jeśli masz pewność, że zawsze chcesz wyczyścić każdy kontekst
preexec () { clear }
A jeśli rzeczywiście chcesz zresetować terminal
zamień słowo clear
na tput reset
tput
jest opcjonalne, ale przyspiesza proces resetowania.