Vi kan använda upp- och nedpilen för att navigera i kommandohistoriken.
I vissa IDE, som Matlab, om vi matar in något och sedan trycker på piltangenterna, bläddrar vi bara mellan historik kommandon som börjar med det vi har inmatat. Det är verkligen bekvämt, men i en skalterminal fungerar det inte.
Finns det något sätt att få en liknande funktion i en skalterminal? Och några andra tips för att förbättra effektiviteten vid terminalanvändning?
Kommentarer
Svar
Vad du letar efter är Ctrl R .
Skriv Ctrl R och skriv sedan en del av det kommando du vill ha. Bash visar det första matchande kommandot. Fortsätt skriva Ctrl R och bash går igenom tidigare matchande kommandon.
Om du vill söka bakåt i historiken skriver du Ctrl S istället. (Om Ctrl S inte fungerar så för dig betyder det troligtvis att du måste inaktivera XON / XOFF flödeskontroll: för att göra det, kör stty -ixon
.)
Detta dokumenteras under ”Söker” i man bash
.
Kommentarer
-
Ctrl-Q
för att avsluta det frysta tillståndet, om du redan trycker påCtrl-S
utan att först stänga av flödeskontrollen och fick din terminal fryst.
Svara
Placera dessa i din ~/.inputrc
:
"\e[5~": history-search-backward "\e[6~": history-search-forward
Dessa gör Page Up och Page Down beter sig som du vill. (Vissa distributioner har det redan konfigurerat för dig.) Jag tycker personligen att det här är bekvämare än Ctrl + R eller history
.
Kommentarer
- Detta är det mest praktiska sättet i alla aktuella svar. du plz ge lite förklaring på arbetsmekanismen?
-
~/.inputrc
eller/etc/inputrc
eller filen som miljövariabeln refererar till$INPUTRC
är konfigurationsfilen för radredigering för alla applikationer som använder readline, inklusive bash (ditt skal). Den har vissa inbyggda funktioner för redigering av rader, inklusive dessa två: i bash ’ s manuella sida söker efter ett av dessa nyckelord för att ta reda på mer.\e[5~
/\e[6~
är escape-sekvenser som genereras av Page Up / Down-tangenterna i de flesta terminalemulatorerna; för att se det, starta kommandotcat
och tryck sedan på dessa tangenter (escape-byte representeras i terminalen som^[
, i inputrc som\e
). - Exemplet i din ursprungliga fråga säger att Upp / Ner-tangenterna fungerar så här i Matlab. Det vore intressant att se vad som hände om du placerade sekvensen Upp och Ner i inputrc och tilldelade den här åtgärden. skulle det fungera korrekt eller ha otäcka biverkningar eftersom det strider mot deras standardbeteende. Jag vet inte ’, jag ’ skulle gärna höra dina resultat om du experimenterar med detta.
- När jag gör
echo $INPUTRC
är den tom. Jag ’ jag använder Ubuntu 14.04 - Jag föredrar personligen att göra uppåt- och nedåtpil för att göra detta:
"\e[A": history-search-backward
och"\e[B": history-search-forward
Svar
Förutom ^ r / ^ s historia i -sökning:
alt . infogar det sista ”ordet” i föregående kommando vid markören. Upprepa det för att få det sista ordet från äldre kommandon. (Men observera att ett efterföljande &
räknas som det sista ordet för bakgrundskommandon).
Detta är super praktiskt för mkdir foo
, cd
alt-dot. Ännu snabbare än uppåtpil, ^ a, alt-d (radera framåtord), cd
.
För att få ordet 2: a till sista, använd esc
-
2
alt+.
använd ett numeriskt argument för emacs-stil för att alt+.
.Negativt räknas in från slutet, positivt räknar framåt från början.) Men detta är vanligtvis mer besvär än det är värt; vid något tillfälle är det snabbare att nå musen och kopiera / klistra in, eller uppåtpil och ^ w / ^ y en del av den (se nedan).
Om din terminal är snyggt / ordentligt inställd kommer ctrl-vänster och ctrl-höger att gå bakåt / framåt med ord. Om inte, förhoppningsvis kommer åtminstone alt-b och alt-f göra samma sak.
ctrl- / är ett ångra. Du kan använda automatisk upprepning för att radera ord mycket mer effektivt om du kan ångra när du överskjuter lite.
Mer kraftfull blandning / matchning av kommandon kommer från att använda dödringen, som fungerar precis som i Emacs. ctrl-y för att klistra in det sista ctrl-w / ctrl-u / ctrl-backsteget / alt-d. alt-y för att bläddra igenom äldre dödad text.
Flera ctrl-w eller vad som helst i rad gör vid inmatning av kill-ring. Använd vänster- och högerpil eller något för att bryta upp posten om du vill ta bort två saker och bara klistra in en senare.
Om du kombinerar alla dessa kan du
- börja skriva ett kommando
- ctrl-r för att gå tillbaka till ett gammalt kommando och ta en del av det med kontroll-w eller liknande.
- esc-r eller
alt+r
för att återställa det till hur det var innan du raderade en del av det. - alt-
>
för att gå till slutet av historien (dvs. nedåtpilen hela vägen), för att komma tillbaka till kommandot du var mitt i.
Andra tips för interaktiv användning:
Aktivera shopt -s globstar
, så att du kan göra **/*.c
(rekursivt inklusive nuvarande dir). Ibland praktiskt för interaktiv användning, men find -name "*.c" -exec foo {} +
är vanligtvis bättre.
Om du skriver bash-skript kommer det att vara bra att ha shopt -s extglob
aktiverat i dina interaktiva skal också. Du ibland hittar en användning för saker som *.!(c|h)
för att matcha filer som inte slutar med .c eller .h.
Hitta alias som du gillar för ls -l
, less
och allt annat du gör mycket. (cp -i
, mv -i
och rm -I
är trevliga. Var inte vana av beroende på dem för att göra en selektiv rm. GNU rm ”s -Jag frågar en gång för alla args.)
Jag gillar alias m=less
(m för ”mer”). Jag har less
konfigurerat med , och . bunden till föregående / nästa fil (lesskey
). Standard är en sekvens med flera tangenter som inte kan användas med autorepeat.
Jag gillar att göra allt inuti GNU-skärmen. Jag har lättare att hålla reda på numrerade skärmfönster än en båtladdning av flikar i Konsole (eller någon annan terminalemulator jag har testat). Om du inte redan vet screen
, lär dig tmux eftersom det är nyare och mindre grovt.
För att få något som fungerar som att öppna ett nytt skal med samma cwd som ett annat skal använder jag en anpassad krok för cd / pushd / popd som låter mig göra cds 8
till cd till vad som helst dir mitt skal i skärmfönster 8 använder. Detta fungerar även för skal utanför skärmens session, så länge det bara finns en skärmsession.
Kommentarer
- Gruvan verkar inte vara ’ ” korrekt konfigurerad ”. Många genvägar som jag ser här fungerar inte ’, jag använder lagerterminal från Ubuntu 14.04. Hur kan jag konfigurera det?
- @JorgeeFG: Jag tror att det fungerade för mig ur lådan med
gnome-terminal
i Ubuntu 14.04, innan jag bytte till KDE. Det relevanta alternativet finns i dina terminalinställningar, esc-prefix vs hig h-bit och kanske några andra inställningar. Vissa av dem fungerar inte ’ för ssh. (t.ex. ctrl vänster / höger munge flyktkoden för piltangenten och jag får5D
visas bokstavligt)
Svar
Lägg till följande rader i din ~/.inputrc
"\e[A": history-search-backward "\e[B": history-search-forward
Detta liknar egmonts svar, men istället för att använda Page Up och Page Down använder det escape-sekvenserna för Arrow Up och Arrow Down. Det här är mycket bekvämare att använda på en Mac.
Svar
Jag brukar alltid konfigurera mina maskiner med ett stort HISTSIZE värde så att det håller en längre historiklista, såväl som HISTTIMEFORMAT med tidsstämpelvärdet så Jag kan se när kommandot kördes.
export HISTSIZE=10000 export HISTTIMEFORMAT="%m/%d/%Y %T "
Svar
Det sätt jag brukar använda är att kombinera history
kommando med grep
IE:
history | grep <command im looking for>
Som visar en numrerad historik över kommandon som du har skrivit och som innehåller det kommandot, kan du sedan använda:
!<number listed in history command>
för att göra om det kommandot.
IE:
history | grep history
142 history 143 history | grep lvresize 568 history | grep echo 570 history | grep echo 571 history | grep history
följt av: !571
upprepas history | grep history
Kommentarer
- CR = mycket bättre + mycket säkrare
- Kanske, personligen tycker jag att en historia som går till grep är ett snabbare sätt att hitta de flesta kommandon. Så långt det är säkrare är jag ’ inte säker på vad du menar, vilka är de inneboende riskerna med att använda historik, som det är möjligt att söka igenom det med cR?
- @ Gravy Jag misstänker att PSkocik betyder att
!
historiensbyte är mindre säker. - @Gravy De inneboende riskerna skulle av misstag få fel linje. Ingen aning om varför din terminal har frusit, såvida du inte använde Control-S och du har aktiverat xon / xoff-flödeskontroll (ofta standard). I så fall tar Control-Q tillbaka det.
- Jag håller med @PSkocik, cr är mycket bättre eftersom det ’ s lättare att redigera historikraden, snarare än att bara köra den igen på samma sätt. Att köra exakt samma kommando igen är ett trivialt fall av vad du kan göra för att spara tid på att skriva om variationer på komplexa enlinjer, eller genom att tabulera en annan fil på en lång väg. Se mitt svar.
Svar
Jag använde dagligen fyra tips (och några andra) i min bash-terminal:
-
Kör sista kommandot:
!!
-
Kör kommando N från historia:
!N
-
Skriv ut sista kommandot som börjar med prefix från historia:
!prefix:p
-
Kör det sista kommandot som börjar med prefix från historia:
!prefix
Kommentarer
- Jag tror att det är en av att använda kommandot N från historia de största vägarna någonsin för att skjuta sig i foten för de flesta människor 🙂 Bara att säga
Svar
Om det är okej att du använder zsh
istället för bash
kan du använda oh-mi-zsh för det.
Du kan navigera i din kommandohistorik med upp- och nedpilarna. Det tillåter också samma navigering när du redan har skrivit in texten (som i Mathlab).
redigera: Oh-my-zsh är ett stort, utvecklarorienterat programvarupaket som innehåller många andra funktioner, t.ex. alias, teman, plugins. Dessa tillbehör gör distributionen mer komplex att använda än en kortkommando.
https://github.com/robbyrussell/oh-my-zsh
Kommentarer
-
oh-my-zsh
innehåller massor av saker. Du kan lika gärna säga: Den här exakta funktionen ingår i den distro, när allt du behöver är en specifik inställning eller app. - Jag redigerade inlägget: Jag varnade för att det är större än en enkel app.
Svar
Lägg till följande alias till ~ / .bashrc
alias h="history | awk """""{$1="";print}""""" |sed "s/^ *//" |grep -v "^h " | sort | uniq | grep"
Användning: h fire
ger mig en lista med kommandon som innehåller eld . eller h ^fire
ger mig en lista med kommandon som börjar med eld .
Detta är användbart när jag vill se en serie kommandon samtidigt.
Förresten är """""
ful men jag kunde inte hitta andra sätt att undvika enstaka citat i enstaka citat.
Kommentarer
- fyi –
h="history | awk '{\$1=\"\"; print}'
ska fungera. Alternativt kan du skapa en funktion och kalla det. - tack DarkHeart, men jag prövade din kod, hittade inte fungerade i min miljö, kanske finns det något annat i mitt
fish
😉\e[5~
och\e[6~
, använd\e[A
,\e[B
.