Hoe kan ik de bash geschiedenis doorzoeken en een commando opnieuw uitvoeren?
Kan ik de geschiedenis in bash doorzoeken en het resultaat uitvoeren?
Kan ik de geschiedenis in bash doorzoeken en het resultaat uitvoeren?
Als alternatief voor crtl+R kun je in de geschiedenis zoeken door
!text
te typen. Hiermee zoek je in de geschiedenis naar het meest recente commando dat begint met ‘text’.
Maar ik stel voor dat je dit in je .bashrc zet om te voorkomen dat je een verkeerd commando uitvoert.
shopt -s histverify
Dit instrueert bash zodanig dat, na elke geschiedenisactie (zoals !!:s/prev_text/after_text
), het de resulterende regel op de opdrachtprompt plaatst. Dan kunt u het commando herzien of bewerken, en daarna op Enter drukken.
Ik gebruik liever history-search-backward dan reverse-search-history. Met de eerste kun je een paar tekens van het commando intypen en dan de zoektoets indrukken, in tegenstelling tot wanneer je eerst de zoektoets indrukt en dan de zoekreeks intypt.
Standaard op mijn systeem binden M-p en M-n zich aan soortgelijke functies, maar ik geef de voorkeur aan het binden van de pijltjestoetsen:
bind '"\e[A":history-search-backward'
bind '"\e[B":history-search-forward'
Uitstekend geschreven, Sean! Ik zou dit in een comment willen zetten, maar ik kom een paar reputatie punten te kort. :-)
Een andere verwante en nuttige techniek is de mogelijkheid om een vorig commando uit te voeren terwijl je een woord verandert. Stel dat je een tikfout hebt gemaakt in de mapnaam, of de bestandsnaam wilt veranderen:
$ echo my name is bob my name is bob $ ^bob^jordan echo my name is jordan my name is jordan
Merk op dat het commando wordt uitgebreid, vervangen, en uitgevoerd voordat het commando wordt uitgevoerd, dus als het verkeerde commando wordt uitgevoerd, kun je zien wat bash dacht dat het aan het doen was.
Aangezien het navigeren door de geschiedenis met behulp van Ctrl-r IMO omslachtig is, kunt u overwegen hh : https://github.com/dvorka/hstr
waarmee de navigatie veel eenvoudiger, ongecompliceerder en efficiënter wordt - inclusief het uitvoeren van het commando:
Typ op de bash commandoprompt control-R, typ dan een paar karakters van het commando dat u wilt en bash’s readline faciliteit zal de commandogeschiedenis doorzoeken voor dat commando.
Nadat u het zoeken hebt gestart, kunt u opnieuw control-R typen om naar het volgende overeenkomende commando te springen.
Als je shell geconfigureerd is om vi
toets bindingen te gebruiken (set -o vi
of set editing-mode vi
in $HOME/.inputrc
), dan zoek je met <Esc>/some-command<Return>
en druk je op n
(volgende) of Shift-n
(vorige) om door de command line history te bladeren.
CTRL+R werkt prima, zoals @John1024 voorstelde, maar is wat vervelend als veel van uw recente commando’s gelijkaardig zijn en u een snelle manier wilt om ze allemaal te scannen. Een alternatief zou zijn om history
:
$ history | grep keyword
Ik hou van HSTR, maar het lukt me soms niet om het te installeren. Dus schreef ik een alias met fzf die het gedrag nabootst (hx
, voor “history execute”)
alias hx='eval $(history | sed "s/^ *[0-9]* *//g" | fzf --tac --tiebreak=index --height=10)'
history
: wel, haal de geschiedenis op sed
: verwijder de nummerkolom uit de lijst (POSIX) fzf
: hier is de magie, hiermee kun je de lijst interactief doorzoeken, of verplaatsen met C-J
en C-K
, en dan een commando uitvoeren met Enter
. --height
: stel het aantal getoonde regels in. --tac
: keer de lijst om (logischer voor een geschiedenis) --tiebreak=index
: bewaar de volgorde van de geschiedenis wanneer fzf de resultaten bijwerkt