Vi kan bruge pil op og pil ned til at navigere i kommandohistorikken.
I nogle IDEer, såsom Matlab, hvis vi indtaster noget og derefter trykker på piletasterne, ruller vi kun mellem historikkommandoerne, der starter med det, vi har input. Det er virkelig praktisk, men i en shell-terminal fungerer det ikke.
Er der en eller anden måde at få en lignende funktion i en shell-terminal? Og andre tip til forbedring af effektiviteten i terminalbrug?
Kommentarer
Svar
Det du leder efter er Ctrl R .
Skriv Ctrl R , og skriv derefter en del af den ønskede kommando. Bash viser den første matchende kommando. Fortsæt med at skrive Ctrl R og bash vil gennemgå tidligere matchende kommandoer.
For at søge baglæns i historikken skal du skrive Ctrl S i stedet. (Hvis Ctrl S ikke fungerer sådan for dig, betyder det sandsynligvis, at du skal deaktivere XON / XOFF-flowkontrol: For at gøre det skal du køre stty -ixon
.)
Dette er dokumenteret under “Søgning” i man bash
.
Kommentarer
-
Ctrl-Q
for at afslutte den frosne tilstand, hvis du allerede har ramtCtrl-S
uden først at slukke for flowkontrol og få din terminal frossen.
Svar
Placer disse i din ~/.inputrc
:
"\e[5~": history-search-backward "\e[6~": history-search-forward
Disse gør Page Up og Side ned opfører dig som du ønsker. (Nogle distributioner har det allerede konfigureret til dig.) Jeg finder personligt denne måde mere bekvemt end Ctrl + R eller history
.
Kommentarer
- Dette er den mest bekvemme måde i alle aktuelle svar. Kunne du giver lidt forklaring på arbejdsmekanismen?
-
~/.inputrc
eller/etc/inputrc
eller filen der henvises til af miljøvariablen$INPUTRC
er konfigurationsfilen til linieredigering af alle applikationer, der bruger readline, inklusive bash (din shell). Det har visse indbyggede linieredigeringsfunktioner, herunder disse to: i bash ‘ s manuel sidesøgning efter et af disse nøgleord for at finde ud af mere.\e[5~
/\e[6~
er flugtsekvenser genereret af Page Up / Down-tasterne i de fleste terminalemulatorer; for at se det skal du starte kommandoencat
og derefter trykke på disse taster (escape-byten er repræsenteret i terminalen som^[
, i inputrc som\e
). - Eksemplet i dit originale spørgsmål siger, at Op / Ned-tasterne fungerer på denne måde i Matlab. Det ville være interessant at se, hvad der skete, hvis du placerede rækkefølgen af op og ned i inputrc og tildelte denne handling; ville det fungere korrekt eller have ubehagelige bivirkninger, da det er i modstrid med deres standardadfærd. Jeg ved ikke ‘, jeg ‘ ville være glad for at høre dine fund, hvis du eksperimenterer med dette.
- Når jeg gør
echo $INPUTRC
, er den tom. Jeg ‘ bruger Ubuntu 14.04 - Jeg foretrækker personligt at tilsidesætte pil op og pil ned for at gøre dette:
"\e[A": history-search-backward
og"\e[B": history-search-forward
Svar
Udover ^ r / ^ s historie i -søgning:
alt . indsætter det sidste “ord” i den forrige kommando ved markøren. Gentag det for at få det sidste ord fra ældre kommandoer. (Men bemærk, at et efterfølgende &
tæller som det sidste ord for baggrundskommandoer).
Dette er super praktisk til mkdir foo
, cd
alt-dot. Endnu hurtigere end pil op, ^ a, alt-d (slet fremadord), cd
.
For at få det 2. til sidste ord skal du bruge esc
-
2
alt+.
brug et numerisk argument for emacs-stil til alt+.
.Negativt tæller ind fra slutningen, positivt tæller frem fra starten.) Men dette er normalt mere besvær end det er værd; på et tidspunkt er det hurtigere at nå ud til musen og kopiere / indsætte eller pil op og ^ w / ^ y en del af det (se nedenfor).
Hvis din terminal er opsat pænt / ordentligt, vil ctrl-venstre og ctrl-højre gå baglæns / fremad med ord. Hvis ikke, forhåbentlig vil i det mindste alt-b og alt-f gøre det samme.
ctrl- / er en fortrydelse. Du kan bruge automatisk gentagelse til at slette ord meget mere effektivt, hvis du kan fortryde, når du overskyder lidt.
Mere kraftfuld blanding / matching af kommandoer kommer fra at bruge kill-ring, som fungerer ligesom i Emacs. ctrl-y for at indsætte det sidste ctrl-w / ctrl-u / ctrl-backspace / alt-d. alt-y for at bladre igennem ældre dræbt tekst.
Flere ctrl-w eller hvad som helst i træk gør ved kill-ring-indgang. Brug venstre og højre pil eller noget for at opdele posten, hvis du vil fjerne to ting og kun indsætte en senere.
Ved at kombinere alle disse sammen kan du
- start med at skrive en kommando
- ctrl-r for at gå tilbage til en gammel kommando og få fat i en del af den med kontrol-w eller lignende.
- esc-r eller
alt+r
for at gendanne det, som det var, før du slettede en del af det. - alt-
>
for at gå til slutningen af historien (dvs. pil ned hele vejen) for at komme tilbage til den kommando, du var midt i.
Andre interaktive brugstips:
Aktivér shopt -s globstar
, så du kan gøre **/*.c
(rekursiv inklusive den aktuelle dir). Nogle gange praktisk til interaktiv brug, men normalt er find -name "*.c" -exec foo {} +
bedre.
Hvis du skriver bash-scripts, vil du finde det praktisk at have shopt -s extglob
også aktiveret i dine interaktive skaller. Du vil nogle gange finde en brug for ting som *.!(c|h)
til at matche filer, der ikke slutter med .c eller .h.
Find aliasser, du kan lide for ls -l
, less
og alt andet, du gør en masse. (cp -i
, mv -i
og rm -I
er rart. Må ikke have en vane af afhængig af dem for at lave en selektiv rm. GNU rm “s -Jeg beder en gang om alle args.)
Jeg kan godt lide alias m=less
(m for “mere”). Jeg har less
opsat med , og . bundet til forrige / næste fil (lesskey
). Standard er en sekvens med flere tastetryk, der ikke kan bruges med autorepeat.
Jeg kan godt lide at gøre alt inden i GNU-skærmen. Jeg finder det lettere at holde styr på nummererede skærmvinduer end en boatload af faner i Konsole (eller enhver anden terminalemulator, jeg har prøvet). Hvis du ikke allerede kender screen
, skal du lære tmux, fordi det er nyere og mindre groft.
For at få noget som funktionaliteten ved at åbne en ny skal med den samme cwd som en anden shell, jeg bruger en brugerdefineret krog til cd / pushd / popd, der lader mig gøre cds 8
til cd til hvad som helst dir my shell i skærmvindue 8 bruger. Dette fungerer selv for skaller uden for skærm sessionen, så længe der kun er en skærm session.
Kommentarer
- Mine ser ikke ud til ‘ ” korrekt konfigureret “. Mange af de genveje, jeg ser her, fungerer ikke ‘ t, jeg bruger lagerterminal fra Ubuntu 14.04. Hvordan kan jeg konfigurere det?
- @JorgeeFG: Jeg synes, det fungerede for mig ud af kassen med
gnome-terminal
i Ubuntu 14.04, før jeg skiftede til KDE. Den relevante mulighed er i dine terminalindstillinger, esc-prefix vs hig h-bit og måske nogle andre indstillinger. Nogle af dem ‘ fungerer ikke perfekt for mig gennem ssh. (f.eks. ctrl venstre / højre munge flugtkoden til piletasten, og jeg får5D
vises bogstaveligt)
Svar
Føj følgende linjer til din ~/.inputrc
"\e[A": history-search-backward "\e[B": history-search-forward
Dette svarer til egmonts svar, men i stedet for at bruge Page Up og Page Down bruger det escape-sekvenserne til Arrow Up og Arrow Down. Denne måde er meget mere praktisk at bruge på en Mac.
Svar
Jeg har altid en tendens til at konfigurere mine maskiner med et stort HISTSIZE værdi, så den holder en længere historikliste samt HISTTIMEFORMAT med tidsstempelværdien Jeg kan se, hvornår blev kommandoen kørt.
export HISTSIZE=10000 export HISTTIMEFORMAT="%m/%d/%Y %T "
Svar
Det middel, jeg normalt bruger, er at kombinere history
kommando med grep
IE:
history | grep <command im looking for>
Der vises en nummereret historik over kommandoer, du har skrevet, der indeholder den kommando, du kan derefter bruge:
!<number listed in history command>
til at gentage denne kommando.
IE:
history | grep history
142 history 143 history | grep lvresize 568 history | grep echo 570 history | grep echo 571 history | grep history
efterfulgt af: !571
gentager history | grep history
Kommentarer
- CR = meget bedre + meget sikrere
- Måske finder jeg personligt, at en historie sendt til grep er et hurtigere middel til at finde de fleste kommandoer. Så vidt det er sikrere, er jeg ‘ ikke sikker på, hvad du mener, hvad er de iboende risici ved at bruge historien, som det er bestemt til at søge gennem den med cR?
- @ Gravy Jeg formoder, at PSkocik betyder, at
!
historiens udskiftning er mindre sikker. - @Gravy De iboende risici ville ved et uheld få den forkerte linje. Ingen idé om, hvorfor din terminal er frossen, medmindre du har brugt Control-S, og du har aktiveret xon / xoff-flowkontrol (ofte standard). I så fald vil Control-Q bringe det tilbage.
- Jeg er enig med @PSkocik, cr er meget bedre, fordi det ‘ s lettere at redigere historiklinjen i stedet for bare at køre den igen på samme måde. At køre den nøjagtige samme kommando igen er et trivielt tilfælde af, hvad du kan gøre for at spare tid på genindtastning af variationer på komplekse one-liners eller tabulering af en anden fil i en lang sti. Se mit svar.
Svar
Jeg brugte dagligt 4 tip (og nogle andre) i min bash-terminal:
-
Udfør sidste kommando:
!!
-
Udfør kommando N fra historikken:
!N
-
Udskriv sidste kommando startende med præfiks fra historikken:
!prefix:p
-
Udfør sidste kommando startende med præfiks fra historik:
!prefix
Kommentarer
- Jeg synes, at det er en af kommandoen N fra historien de største stier til nogensinde at skyde sig i foden for de fleste mennesker 🙂 Bare sige
Svar
Hvis det er okay for dig at bruge zsh
i stedet for bash
, kan du bruge oh-mi-zsh for det.
Du kan navigere i din kommandohistorik med pilene op og ned. Det tillader også den samme navigation, når du allerede har skrevet teksten (som i Mathlab).
edit: Oh-my-zsh er en stor, udviklerorienteret softwarepakke, der indeholder mange andre funktioner, f.eks aliaser, temaer, plugins. Disse ekstra gør distributionen mere kompleks at bruge end en tastaturgenvej.
https://github.com/robbyrussell/oh-my-zsh
Kommentarer
-
oh-my-zsh
indeholder masser af ting. Du kan lige så godt sige: Denne nøjagtige funktion er inkluderet i den distro, når alt hvad du behøver er en bestemt indstilling eller app. - Jeg redigerede indlægget: Jeg advarede om, at det er større end en simpel app.
Svar
Føj følgende alias til ~ / .bashrc
alias h="history | awk """""{$1="";print}""""" |sed "s/^ *//" |grep -v "^h " | sort | uniq | grep"
Brug: h fire
giver mig en liste over kommandoer, der indeholder ild . eller h ^fire
giver mig en liste over kommandoer, der begynder med brand .
Dette er nyttigt, når jeg vil se en række kommandoer på samme tid.
Forresten, """""
er grimt, men jeg kunne ikke finde andre måder at undgå enkelt citater i enkelt citater.
Kommentarer
- fyi –
h="history | awk '{\$1=\"\"; print}'
skal fungere. Opret alternativt en funktion og kald det. - tak DarkHeart, men jeg prøvede din kode, fandt ikke fungeret i mit miljø, måske er der noget andet i min
fish
😉\e[5~
og\e[6~
skal du bruge\e[A
,\e[B
.