Kan ik bash configureren om “ clear ” uit te voeren vóór elke opdracht die in de console wordt getypt?

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 waarom local 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, typ ls;# becommentariëren wat er was, en voer het ls 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

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *