Zoek naar een vorige opdracht met het voorvoegsel dat ik zojuist heb getypt

We kunnen de pijl omhoog en omlaag gebruiken om door de opdrachtgeschiedenis te navigeren.

In sommige IDEs, zoals Matlab, als we iets invoeren en vervolgens op de pijltjestoetsen drukken, scrollen we alleen tussen de geschiedenisopdrachten, beginnend met wat we hebben ingevoerd. Dat is echt handig, maar in een shell-terminal werkt dit niet.

Is er een manier om een vergelijkbare functie te krijgen in een shell-terminal? En nog andere tips voor het verbeteren van de efficiëntie bij terminalgebruik?

Reacties

  • Je zou gewoon een shell kunnen gebruiken die zon functie biedt, zoals fish😉
  • @yoann jij ‘ gaat ervan uit dat bash niet ‘ t . Het is, via readline, gewoon niet standaard toegankelijk.
  • @muru I ‘ ben me bewust van CTRL + R in bash, en egmont ‘ s antwoord biedt een handige manier om het te doen met Page Up / Page Down. Is er echter een manier om dit te doen met de pijltjestoetsen?
  • @yoann bekijk unix.stackexchange.com/a/76591/70524. Gebruik in plaats van \e[5~ en \e[6~ \e[A, \e[B.

Answer

Wat je zoekt is Ctrl R .

Typ Ctrl R en typ vervolgens een deel van het commando dat je wilt. Bash geeft het eerste overeenkomende commando weer. Blijf Ctrl R typen en bash bladert door eerdere overeenkomende commandos.

Om achteruit in de geschiedenis te zoeken, typ je Ctrl S in plaats daarvan. (Als Ctrl S niet op die manier voor jou werkt, betekent dat waarschijnlijk dat je XON / XOFF flow control moet uitschakelen: om dat te doen, voer je stty -ixon.)

Dit wordt gedocumenteerd onder “Zoeken” in man bash.

Opmerkingen

  • Ctrl-Q om de bevroren status te verlaten, als je al op zonder eerst de flow control uit te zetten en je terminal vast te zetten.

Antwoord

Plaats deze in uw ~/.inputrc:

"\e[5~": history-search-backward "\e[6~": history-search-forward 

Deze maken Page Up en Page Down gedragen zich zoals je wilt. (sommige distributies hebben het al voor je geconfigureerd.) Ik vind deze manier persoonlijk handiger dan Ctrl + R of history.

Reacties

  • Dit is de handigste manier in alle huidige antwoorden. Zou u plz geef een beetje uitleg over het werkingsmechanisme?
  • ~/.inputrc of /etc/inputrc of het bestand waarnaar wordt verwezen door de omgevingsvariabele $INPUTRC is het configuratiebestand voor het bewerken van regels van alle applicaties die readline gebruiken, inclusief bash (uw shell). Het heeft bepaalde ingebouwde regelbewerkingsmogelijkheden, waaronder deze twee: zoek in bash ‘ s handmatige pagina naar een van deze sleutelwoorden om meer te weten te komen. \e[5~ / \e[6~ zijn de escape-reeksen die worden gegenereerd door de Page Up / Down-toetsen in de meeste terminalemulators; om het te zien, start u de opdracht cat en drukt u op deze toetsen (de escape-byte wordt in de terminal weergegeven als ^[, in inputrc als \e).
  • Het voorbeeld in je oorspronkelijke vraag zegt dat de toetsen Omhoog / Omlaag op deze manier werken in Matlab. Het zou interessant zijn om te zien wat er gebeurde als je de volgorde van Omhoog en Omlaag in inputrc zou plaatsen en aan deze actie zou toewijzen; zou het correct werken, of vervelende bijwerkingen hebben omdat het in strijd is met hun standaardgedrag. Ik ‘ weet het niet, ik ‘ zou graag je bevindingen horen als je hiermee experimenteert.
  • Als ik echo $INPUTRC doe, is het leeg. Ik ‘ m gebruikend Ubuntu 14.04
  • Persoonlijk geef ik er de voorkeur aan de pijl omhoog en omlaag te overschrijven om dit te doen: "\e[A": history-search-backward en "\e[B": history-search-forward

Antwoord

Naast ^ r / ^ s geschiedenis i -search:

alt . voegt het laatste “woord” van het vorige commando in bij de cursor. Herhaal het om het laatste woord van oudere opdrachten te krijgen. (Merk echter op dat een afsluitende & telt als het laatste woord voor achtergrondopdrachten).

Dit is superhandig voor mkdir foo, cd alt-dot. Nog sneller dan pijl-omhoog, ^ a, alt-d (verwijder voorwaarts woord), cd.

Gebruik om het op een na laatste woord te krijgen esc - 2 alt+. (dwz gebruik een numeriek argument in emacs-stijl voor alt+..Negatief telt vanaf het einde in, positief telt vanaf het begin.) Maar dit is meestal meer moeite dan het waard is; op een gegeven moment is het sneller om de muis te pakken en te kopiëren / plakken, of pijl-omhoog en ^ w / ^ y een deel ervan (zie hieronder).


Als uw terminal mooi / correct is ingesteld, zullen ctrl-left en ctrl-right woorden achteruit / vooruit gaan. Als dit niet het geval is, zullen hopelijk alt-b en alt-f hetzelfde doen.


ctrl- / is een ongedaan maken. U kunt automatisch herhalen gebruiken om woorden veel efficiënter te verwijderen als u dit ongedaan kunt maken wanneer u een beetje doorschiet.


Krachtiger mixen / matchen van commandos komt van het gebruik van de kill-ring, die werkt net als in Emacs. ctrl-y om de laatste ctrl-w / ctrl-u / ctrl-backspace / alt-d te plakken. alt-y om door oudere gedode tekst te bladeren.

Meerdere ctrl-w of wat dan ook op een rij maken op kill-ring invoer. Gebruik de linker- en rechterpijl of zoiets om het item op te splitsen als je twee dingen wilt verwijderen en pas er later een wilt plakken.

Door al deze dingen samen te combineren, kun je

  • begin een commando te typen
  • ctrl-r om terug te gaan naar een oud commando en een deel ervan te pakken met control-w of iets dergelijks.
  • esc-r of alt+r om het te herstellen naar hoe het was voordat u een deel ervan verwijderde.
  • alt- > om naar het einde van de geschiedenis te gaan (dwz de pijl helemaal naar beneden), om terug te gaan naar het commando waar u middenin zat.

Andere tips voor interactief gebruik:

Schakel shopt -s globstar in, zodat u **/*.c kunt doen (recursief inclusief de huidige dir). Soms handig voor interactief gebruik, maar meestal is find -name "*.c" -exec foo {} + beter.

Als je bash-scripts schrijft, “vind je het handig om shopt -s extglob ook ingeschakeld in uw interactieve shells. U zult soms een toepassing vinden voor zaken als *.!(c|h) om bestanden te matchen die niet eindigen met .c of .h.

Vind aliassen die je leuk vindt voor ls -l, less en al het andere dat je doet veel. (cp -i, mv -i en rm -I zijn aardig. Maak er geen gewoonte van van afhankelijk van hen om een selectieve rm uit te voeren. GNU rm “s -Ik vraagt één keer om alle argumenten.)

Ik hou van alias m=less (m voor “meer”). Ik heb less ingesteld met , en . gebonden aan vorig / volgend bestand (lesskey). De standaard is een reeks met meerdere toetsen die “niet kan worden gebruikt met autorepeat.


Ik doe graag alles binnen het GNU-scherm. Ik vind het gemakkelijker om genummerde schermvensters bij te houden dan een bootlading tabbladen in Konsole (of een andere terminalemulator die ik heb geprobeerd). Als je screen nog niet weet, leer dan tmux omdat het nieuwer en minder lomp is.

Om zoiets te krijgen als de functionaliteit van het openen van een nieuwe shell met dezelfde cwd als een andere shell, ik gebruik een aangepaste hook voor cd / pushd / popd waarmee ik cds 8 kan doen om cd naar wat dan ook te doen dir die mijn shell in schermvenster 8 gebruikt. Dit werkt zelfs voor shells buiten de schermsessie, zolang er maar één schermsessie is.

Opmerkingen

  • De mijne lijkt niet ‘ t ” correct geconfigureerd te zijn “. Veel van de snelkoppelingen die ik hier zie, werken niet ‘, ik gebruik stock Terminal van Ubuntu 14.04. Hoe kan ik het configureren?
  • @JorgeeFG: Ik denk dat het voor mij uit de doos werkte met gnome-terminal in Ubuntu 14.04, voordat ik overschakelde naar KDE. De relevante optie is in je terminalinstellingen, esc-prefix vs hig h-bit, en misschien enkele andere instellingen. Sommigen van hen werken niet perfect voor mij via ssh, ‘. (bijv. ctrl links / rechts negeert de escape-code voor de pijltoets, en ik krijg 5D letterlijk te zien)

Antwoord

Voeg de volgende regels toe aan uw ~/.inputrc

"\e[A": history-search-backward "\e[B": history-search-forward 

Dit is vergelijkbaar met het antwoord van egmont, maar in plaats van Page Up en Page Down te gebruiken, gebruikt het de escape-sequenties voor Arrow Up en Arrow Down. Deze manier is veel handiger om te gebruiken op een Mac.

Antwoord

Ik heb altijd de neiging om mijn machines te configureren met een grote HISTSIZE waarde zodat het een langere geschiedenislijst bijhoudt, evenals HISTTIMEFORMAT met de tijdstempelwaarde dus Ik kan zien wanneer het commando is uitgevoerd.

export HISTSIZE=10000 export HISTTIMEFORMAT="%m/%d/%Y %T " 

Antwoord

Het middel dat ik gewoonlijk gebruik, is om de history commando met grep

IE:

history | grep <command im looking for> 

Dat geeft een genummerde geschiedenis weer van de commandos die je hebt getypt die dat commando bevatten, je kunt dan gebruiken:

!<number listed in history command> 

om dat commando opnieuw uit te voeren.

IE:

history | grep history

142 history 143 history | grep lvresize 568 history | grep echo 570 history | grep echo 571 history | grep history 

gevolgd door: !571

herhaalt history | grep history

Reacties

  • CR = veel beter + veel veiliger
  • Misschien vind ik persoonlijk dat een geschiedenis doorgesluisd naar grep een snellere manier is om de meeste commandos te vinden. Wat Veiliger betreft, ik ‘ m niet zeker wat u bedoelt, wat zijn de inherente risicos van het gebruik van geschiedenis in tegenstelling tot het doorzoeken met cR?
  • @ Jus Ik vermoed dat PSkocik betekent dat de ! geschiedenisvervanging minder veilig is.
  • @Gravy De inherente risicos zouden per ongeluk de verkeerde regel krijgen. Geen idee waarom je terminal is vastgelopen, tenzij je Control-S hebt gebruikt en je xon / xoff flow control hebt ingeschakeld (vaak de standaard). Als dit het geval is, brengt Control-Q het terug.
  • Ik ben het met @PSkocik eens, cr is veel beter omdat het ‘ s gemakkelijker om de geschiedenisregel te bewerken, in plaats van deze gewoon opnieuw op dezelfde manier uit te voeren. Het opnieuw uitvoeren van exact dezelfde opdracht is een triviaal geval van wat u kunt doen om tijd te besparen door variaties op complexe oneliners opnieuw te typen of door een ander bestand in een lang pad met tabs te voltooien. Zie mijn antwoord.

Antwoord

Ik gebruikte dagelijks 4 tips (en enkele andere) in mijn bash-terminal:

  • Voer het laatste commando uit: !!

  • Voer het commando uit N uit geschiedenis: !N

  • Laatste commando afdrukken beginnend met voorvoegsel uit geschiedenis: !prefix:p

  • Voer de laatste opdracht uit beginnend met voorvoegsel uit geschiedenis: !prefix

Reacties

  • Ik denk dat het gebruik van de opdracht N uit de geschiedenis er een van is de beste paden ooit om jezelf in de voet te schieten voor de meeste mensen 🙂 Gewoon zeggen

Antwoord

Als je mag zsh gebruiken in plaats van bash, je kunt oh-mi-zsh gebruiken daarom.

U kunt door uw opdrachtgeschiedenis navigeren met de pijlen omhoog en omlaag. Het staat ook dezelfde navigatie toe als je de tekst al hebt getypt (zoals in Mathlab).

bewerken: Oh-my-zsh is een groot, ontwikkelaarsgericht softwarepakket dat vele andere functies bevat, bijv aliassen, themas, plug-ins. Deze extras maken het gebruik van de distributie ingewikkelder dan een sneltoets.

https://github.com/robbyrussell/oh-my-zsh

Reacties

  • oh-my-zsh bevat heel veel dingen. Je zou net zo goed kunnen zeggen: deze exacte functie is opgenomen in die distro, als je alleen een specifieke instelling of app nodig hebt.
  • Ik heb het bericht bewerkt: ik heb gewaarschuwd dat het groter is dan een simpele app.

Answer

Voeg de volgende alias toe aan ~ / .bashrc

alias h="history | awk """""{$1="";print}""""" |sed "s/^ *//" |grep -v "^h " | sort | uniq | grep" 

Gebruik: h fire geeft me een lijst met commandos die fire bevatten. of h ^fire geeft me een lijst met commandos die beginnen met fire .

Dit is handig als ik een reeks commandos wil bekijken op hetzelfde moment.

Trouwens, """"" is lelijk, maar ik kon geen andere manieren vinden om enkele aanhalingstekens tussen enkele aanhalingstekens te vermijden.

Reacties

  • fyi – h="history | awk '{\$1=\"\"; print}' zou moeten werken. Of maak een functie en roep die aan.
  • bedankt DarkHeart, maar ik heb je code geprobeerd, vond het niet werken in mijn omgeving, misschien is er iets anders in de mijne

Geef een reactie

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