Czy mogę skonfigurować basha tak, aby wykonywał “ clear ” przed każdym poleceniem wpisywanym w konsoli?

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ć, dlaczego local 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, wpisz ls;# komentując to, co tam było, i poprawnie uruchom polecenie ls! 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.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *