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ć?
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ę.
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_COMMANDlocal 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.
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!
\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.
Odpowiedzi:
Bash ma wcześniejszy hak . Raczej.
źródło
Enter
przed 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.[ "$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ć, dlaczegolocal this_command=`history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//g"`;
tu jest?history -1
drukuje ostatni wiersz poleceń, z numerem historii z przodu. Filtr sed usuwa numer historii.Następnie za każdym razem, gdy naciśniesz returnzamiast pisać
\n
, przejdzie na początek wiersza, wprowadzi tekstclear;
, a następnie przejdzie na koniec i wprowadzi\n
zgodnie z oczekiwaniami.źródło
clear
poleceń poleceniami.clear
jest wykonywane przed wydaniem polecenia, a dane wyjściowe polecenia nie znikają. Jednak w przypadku pytania natychmiastowego.clear;
do wyjścia dla każdego dodatkowego\n
.bind "\"\\eOQ\":\"\e[1~ls;#\\n\""
przejdzie na początek, wpiszls;#
komentarz do tego, co tam było i uruchomls
polecenie poprawnie! dzięki!z pytania, które dziś zadałem (z podziękowaniem dla odpowiedzi użytkownika @ aecolley ):
\C-m
Symulowanie klawisza „Enter”, to\C-l
symulacjaCtrl+l
, jak to jest jasne, a\C-j
to „newline-and-indent”, więc komenda jest wiążąca Wprowadź klucz do Ctrl + L & Ctrl + Jktó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.
źródło
Rozważ wyczyszczenie tylko wtedy, gdy chcesz
Używa haka o nazwie
preexec
, potwierdzone, działa również z zshNastę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
A jeśli naprawdę chcesz zresetować terminal
zastąpić słowo
clear
ztput reset
tput
jest opcjonalny, ale przyspiesza proces resetowaniaźródło