Ik zou bash willen configureren om het clear
commando uit te voeren elke keer dat ik een commando typ in de terminal (voor uitvoeren van mijn commando). Hoe kan ik dat doen?
Ik gebruik Debian Linux.
Opmerkingen
- U vindt deze thread is nuttig.
- Gewoon nieuwsgierig: wat ' vraagt u hiervoor aan? Behalve wanneer ik ' m foutopsporingsprogrammas met veel output, ik wil meestal zoveel mogelijk op het scherm houden om me te helpen de context bij te houden I ' ik werk mee.
Answer
Bash heeft een precommand hook . Soort van.
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
Reacties
- Gilles: ik heb geplakt het bovenstaande in een konsole-terminal en de uitvoer van elke opdracht die ik vervolgens heb ingevoerd, werd gewist voordat ik het kon lezen. Mis ik iets? Wat gebeurt er ook met dit (en het andere antwoord hieronder) als ik een meerregelig bash-script aanroep waar meer dan één regel (of een andere regel dan de laatste) inter genereert esting output?
- @Joe Dit zou het scherm moeten leegmaken nadat je op
Enter
hebt gedrukt, voordat je het commando uitvoert. Voor mij werkt het zo. De preexec hook wordt uitgevoerd voor elk interactief commando, het maakt ' niet uit of het commando een ingebouwd of een extern commando is of veel commandos. - @ Joe, je moet deze regel hieronder toevoegen; niets doen als het voltooid is
[ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return;
het probleem is dat PROMPT_COMMAND wordt uitgevoerd en ook wordt vastgehouden na het eigenlijke commando; Kan iemand me ook vertellen waaromlocal this_command=`history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//g"`;
hier is? - @JamesAndino
history -1
drukt de laatste opdrachtregel af, met een geschiedenisnummer vooraan. Het sed-filter verwijdert het geschiedenisnummer. - @JamesAndino Dat zorgde ervoor dat het werkte (en ik zie dat Giles het aan zijn antwoord heeft toegevoegd.)
Antwoord
bind "RETURN: "\e[1~clear; \e[4~\n""
Daarna elke keer dat u op return drukt in plaats van alleen het zal naar het begin van de regel gaan, de tekst clear;
invoeren, dan naar het einde gaan en \n
zoals verwacht.
Opmerkingen
- Een nieuwe regel zorgt ervoor dat de prompt toch wordt afgedrukt, dus door de duidelijke in de prompt te plaatsen, wordt hetzelfde bereikt zonder de opdrachtgeschiedenis te vervuilen met
clear
opdrachten. - @ jw013 Het verschil is dat in mijn geval
clear
wordt uitgevoerd voordat de opdracht en opdrachtuitvoer niet ' verdwijnt. Maar in het geval van een prompt. - Ik zou willen dat er een manier was om dit te doen zonder de opdrachtregel zelf te hoeven wijzigen – ik ' weet zeker dat dit zou gebeuren op interessante manieren breken op complexe of meerregelige commandos, maar ik kan ' geen betere manier vinden om dit te doen.
- @ jw013, je hebt gelijk, het breekt wel voor meerdere regels .. Het voegt
clear;
toe aan de uitvoer voor elke extra\n
. - deze tip is erg goed thx !! Ik moest een specifieke code aan F2 binden, maar soms heeft de regel een commando dat ik heb getypt maar niet heb uitgevoerd, dus met dit voorbeeld:
bind "\"\\eOQ\":\"\e[1~ls;#\\n\""
zal het naar het begin gaan, typls;#
becommentariëren wat er was, en voer hetls
commando correct uit! thx!
Antwoord
van een vraag die ik vandaag heb gesteld (met dank aan gebruiker @aecolley” s antwoord ):
bind ""\C-m": "\C-l\C-j""
De \C-m
simuleert de “Enter” -toets, de \C-l
simuleert Ctrl+l
zoals deze “duidelijk is” en de \C-j
is “newline-and-indent”, dus het commando is bindend Enter-toets aan Ctrl + l & Ctrl + j
dat werkt op GNU bash, versie 3.2.53 (1) -release (x86_64-apple-darwin14) en de andere antwoorden op deze thread niet. ook vervuilt dit de geschiedenis niet met “clear” -opdrachten om de andere opdracht.
Reacties
- opmerking: als je over ssh gebruikt, moet je het in die omgeving uitvoeren, anders gebeurt er gekheid.
- begroet het werkt op mijn ubuntu 16.04-terminal, bedankt, maar hoe werkt het, kun je een link of documentatie geven?
Antwoord
Overweeg alleen te wissen als je wilt
cb4() { preexec () { clear } }
Dit gebruikt een hook genaamd preexec
, bevestigd werkt ook met zsh
Vervolgens elke sessie die je automatisch wilt wissen voor elke opdracht die je uitvoert : cb4
Als u zeker weet dat u altijd in elke context wilt wissen
preexec () { clear }
En a als je de terminal daadwerkelijk wilt resetten
vervang het woord clear
door tput reset
tput
is optioneel, maar versnelt het resetproces