Czy mogę skonfigurować bash, aby wykonywał polecenie „wyczyść” przed każdym poleceniem wpisanym w konsoli?


22

Chciałbym skonfigurować bash, aby wykonywał clearpolecenie za każdym razem, gdy wpisuję jakieś polecenie w terminalu (przed wykonaniem polecenia). Jak mogę to zrobić?

Używam Debian Linux.


Ten wątek jest dla Ciebie przydatny.
Thor

3
Ciekawe: co o to aplikujesz? Z wyjątkiem sytuacji, gdy debuguję programy z dużą ilością danych wyjściowych, zwykle chcę zachować jak najwięcej na ekranie, aby pomóc mi śledzić kontekst, w którym pracuję.
Joe

Odpowiedzi:


22

Bash ma wcześniejszy hak . Raczej.

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

Gilles: Wkleiłem powyższe do terminalu konsoli i dane wyjściowe z każdego polecenia, które następnie wprowadziłem, zostały wyczyszczone, zanim mogłem je odczytać. Czy coś brakuje? Co się też stanie z tym (i drugą odpowiedzią poniżej), jeśli wywołam wieloliniowy skrypt bash, w którym więcej niż jedna linia (lub dowolna linia inna niż ostatnia) generuje ciekawe wyniki?
Joe

@Joe Powinno to wyczyścić ekran po naciśnięciu Enterprzed wykonaniem polecenia. Dla mnie to działa. Preexec hook jest wykonywany dla każdego polecenia interaktywnego, nie ma znaczenia, czy polecenie jest poleceniem wbudowanym czy zewnętrznym, czy też wieloma poleceniami.
Gilles „SO - przestań być zły”,

1
@Joe, musisz dodać ten wiersz poniżej, nie rób nic, jeśli zakończony [ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return;problem polega na tym, że PROMPT_COMMAND jest uruchamiany i uwięziony po właściwym poleceniu; Czy ktoś może mi powiedzieć, dlaczego local this_command=`history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//g"`;tu jest?
MageProspero

@JamesAndino history -1drukuje ostatni wiersz poleceń, z numerem historii z przodu. Filtr sed usuwa numer historii.
Gilles „SO- przestań być zły”

@JamesAndino To sprawiło, że zadziałało (i widzę, że Giles dodał to do swojej odpowiedzi.)
Joe

6
bind 'RETURN: "\e[1~clear; \e[4~\n"'

Następnie za każdym razem, gdy naciśniesz returnzamiast pisać \n, przejdzie na początek wiersza, wprowadzi tekst clear;, a następnie przejdzie na koniec i wprowadzi \nzgodnie z oczekiwaniami.


2
Nowy wiersz i tak powoduje wydrukowanie monitu, więc umieszczenie go w monicie powoduje to samo bez zanieczyszczania historii clearpoleceń poleceniami.
jw013,

2
@ jw013 Różnica polega na tym, że w moim przypadku polecenie clearjest wykonywane przed wydaniem polecenia, a dane wyjściowe polecenia nie znikają. Jednak w przypadku pytania natychmiastowego.
pędzi

Chciałbym, aby istniał jakiś sposób, aby to zrobić bez konieczności modyfikowania samej linii poleceń - jestem pewien, że to by się zepsuło w ciekawy sposób w przypadku złożonych lub wieloliniowych poleceń, ale nie mogę znaleźć lepszego sposobu na zrobienie tego.
jw013,

@ jw013, masz rację, przerywa dla wielu linii. Wstawia clear;do wyjścia dla każdego dodatkowego \n.
Peter.O,

ta rada jest bardzo dobra dzięki !! Musiałem powiązać jakiś konkretny kod z F2, ale czasami wiersz zawiera jakieś polecenie, które wpisałem, ale nie wykonałem, więc w tym przykładzie: bind "\"\\eOQ\":\"\e[1~ls;#\\n\""przejdzie na początek, wpisz ls;#komentarz do tego, co tam było i uruchom lspolecenie poprawnie! dzięki!
Aquarius Power

2

z pytania, które dziś zadałem (z podziękowaniem dla odpowiedzi użytkownika @ aecolley ):

bind '"\C-m": "\C-l\C-j"'

\C-mSymulowanie klawisza „Enter”, to \C-lsymulacja Ctrl+l, jak to jest jasne, a \C-jto „newline-and-indent”, więc komenda jest wiążąca Wprowadź klucz do Ctrl + L & Ctrl + J

który działa na GNU bash, wersja 3.2.53 (1) -release (x86_64-apple-darwin14) i inne odpowiedzi w tym wątku nie. nie powoduje to również zanieczyszczenia historii „czystymi” poleceniami co każde inne polecenie.


1
Uwaga: jeśli używasz over ssh, musisz go wykonać w tym środowisku lub zdarza się dziwność.
TRB

greate to działa na moim terminalu Ubuntu 16.04, dziękuję, ale jak to działa, czy możesz podać link lub dokumentację?
Andrzej Rehmann,

0

Rozważ wyczyszczenie tylko wtedy, gdy chcesz

cb4() {
  preexec () {
    clear
  }
}

Używa haka o nazwie preexec, potwierdzone, 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 jesteś pewien, zawsze chcesz wyczyścić w każdym kontekście

preexec () {
  clear
}

A jeśli naprawdę chcesz zresetować terminal

zastąpić słowo clearztput reset

tput jest opcjonalny, ale przyspiesza proces resetowania

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.