Căutați o comandă anterioară cu prefixul pe care tocmai l-am tastat

Putem folosi săgeata sus și jos pentru a naviga în istoricul comenzilor.

În unele IDE, cum ar fi Matlab, dacă introducem ceva și apoi apăsăm tastele săgeată, ne derulăm doar între comenzile istorice începând cu ceea ce avem introdus. Este foarte convenabil, dar într-un terminal shell, acest lucru nu funcționează.

Există vreo modalitate de a obține o funcție similară într-un terminal shell? Și alte sfaturi pentru îmbunătățirea eficienței în utilizarea terminalului?

Comentarii

  • Puteți utiliza pur și simplu un shell care oferă o astfel de caracteristică, cum ar fi fish😉
  • @yoann ‘ presupunând că bash nu ‘ t . Acesta, prin readline, nu este accesibil în mod implicit.
  • @muru Sunt ‘ conștient de CTRL + R în bash și egmont oferă o modalitate de a face acest lucru cu Page Up / Page Down. Există totuși o modalitate de a face acest lucru cu tastele săgeată?
  • @yoann verificați unix.stackexchange.com/a/76591/70524. În loc de \e[5~ și \e[6~, utilizați \e[A, \e[B.

Răspuns

Ceea ce căutați este Ctrl R .

Tastați Ctrl R și apoi tastați o parte din comanda dorită. Bash va afișa prima comandă potrivită. Continuați să tastați Ctrl R și bash va parcurge comenzile de potrivire anterioare.

Pentru a căuta înapoi în istoric, tastați Ctrl S în schimb. (Dacă Ctrl S nu funcționează așa pentru dvs., probabil că înseamnă că trebuie să dezactivați controlul fluxului XON / XOFF: pentru a face acest lucru, rulați stty -ixon.)

Aceasta este documentată la „Căutare” în man bash.

Comentarii

  • Ctrl-Q pentru a ieși din starea înghețată, dacă apăsați deja pe Ctrl-S fără a dezactiva mai întâi controlul fluxului și ați blocat terminalul.

Răspuns

Plasați-le în ~/.inputrc:

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

Acestea fac Pagină în sus și Pagină în jos se comportă după cum doriți. (Unele distribuții l-au configurat deja pentru dvs.) Personal, acest lucru mi se pare mai convenabil decât Ctrl + R sau history.

Comentarii

  • Acesta este cel mai convenabil mod în toate răspunsurile actuale. u plz da un pic explicație despre mecanismul de lucru?
  • ~/.inputrc sau /etc/inputrc sau fișierul la care face referire variabila de mediu $INPUTRC este fișierul de configurare pentru editarea liniei tuturor aplicațiilor care utilizează readline, inclusiv bash (shell-ul dvs.). Are anumite capabilități de editare a liniilor încorporate, inclusiv aceste două: în pagina manuală bash ‘ căutați unul dintre aceste cuvinte cheie pentru a afla mai multe. \e[5~ / \e[6~ sunt secvențele de evacuare generate de tastele Pagină sus / jos în majoritatea emulatoarelor terminale; pentru ao vedea, lansați comanda cat și apoi apăsați aceste taste (octetul de evacuare este reprezentat în terminal ca ^[, în inputrc ca \e).
  • Exemplul din întrebarea inițială spune că tastele Sus / Jos funcționează astfel în Matlab. Ar fi interesant să vedeți ce s-a întâmplat dacă ați plasa secvența Sus și Jos în inputrc și ați atribui această acțiune; ar funcționa corect sau ar avea efecte secundare urâte deoarece intră în conflict cu comportamentul lor implicit. ‘ nu știu, ‘ aș fi fericit să vă aud concluziile dacă experimentați acest lucru.
  • Când fac echo $INPUTRC este gol. ‘ folosesc Ubuntu 14.04
  • Personal prefer să înlocuiesc săgeata în sus și în jos pentru a face acest lucru: "\e[A": history-search-backward și "\e[B": history-search-forward

Răspuns

Pe lângă istoricul ^ r / ^ s -search:

alt . introduce ultimul „cuvânt” al comenzii anterioare la cursor. Repetați-l pentru a obține ultimul cuvânt din comenzi mai vechi. (Dar rețineți că un & final contează ca ultimul cuvânt pentru comenzile de fundal).

Acest lucru este foarte util pentru mkdir foo, cd alt-dot. Chiar mai rapid decât săgeata în sus, ^ a, alt-d (șterge cuvântul înainte), cd.

Pentru a obține al doilea până la ultimul cuvânt, utilizați esc - 2 alt+. utilizați un argument numeric în stil emacs pentru a alt+..Contorizări negative de la sfârșit, contorizări pozitive înainte de la început.) Dar aceasta este de obicei mai multă problemă decât merită; la un moment dat este mai rapid să ajungeți la mouse și să copiați / lipiți, sau săgeată sus și ^ w / ^ y parte din el (vezi mai jos).


Dacă terminalul este configurat frumos / corect, ctrl-stânga și ctrl-dreapta vor merge înapoi / înainte prin cuvinte. Dacă nu, sperăm că cel puțin alt-b și alt-f vor face același lucru.


ctrl- / este o anulare. Puteți utiliza repetarea automată pentru ștergerea cuvintelor mult mai eficient dacă puteți anula când depășiți puțin.


Amestecarea / potrivirea mai puternică a comenzilor provine din folosirea kill-ring, care funcționează la fel ca în Emacs. ctrl-y pentru a lipi ultimul ctrl-w / ctrl-u / ctrl-backspace / alt-d. alt-y pentru a parcurge textul mai vechi ucis.

Ctrl-w multiplu sau orice altceva dintr-un rând face la intrarea kill-ring. Utilizați săgeata stânga și dreapta sau ceva pentru a sparge intrarea dacă doriți să eliminați două lucruri și să lipiți una mai târziu.

Combinând toate acestea împreună, puteți

  • începeți să tastați o comandă
  • ctrl-r pentru a reveni la o comandă veche și a apuca o parte din aceasta cu control-w sau similar.
  • esc-r sau alt+r pentru a-l restabili cum era înainte de a șterge o parte din acesta.
  • alt- > pentru a merge la sfârșitul istoriei (adică săgeata în jos până la capăt), pentru a reveni la comanda în care te aflați.

Alte sfaturi de utilizare interactivă:

Activați shopt -s globstar, astfel încât să puteți face **/*.c (recursiv inclusiv actualul dir). Uneori la îndemână pentru utilizare interactivă, dar de obicei find -name "*.c" -exec foo {} + este mai bun.

Dacă scrieți scripturi bash, veți găsi la îndemână să aveți shopt -s extglob activat și în shell-urile dvs. interactive. Veți uneori găsi o utilizare pentru lucruri precum *.!(c|h) pentru a se potrivi fișierelor care nu se termină cu .c sau .h.

Găsiți aliasuri care vă plac pentru ls -l, less și orice altceva faceți mult. (cp -i, mv -i și rm -I sunt frumoase. Nu vă obișnuiți de în funcție de ei pentru a face un rm selectiv. GNU rm „s -I cere o dată pentru toate argumentele.)

Îmi place alias m=less (m pentru „mai mult”). Am less configurat cu , și . legat de fișierul anterior / următor (lesskey). Implicit este o secvență de apăsare pe mai multe taste care nu poate fi utilizată cu repetarea automată.


Îmi place să fac totul în ecranul GNU. Mi se pare mai ușor să urmăresc ferestrele numerotate decât o încărcarea de file în Konsole (sau orice alt emulator de terminal am încercat). Dacă nu știți deja screen, învățați tmux deoarece este mai nou și mai puțin dificil.

Pentru a obține ceva de genul funcționalității deschiderii unui shell nou cu același cwd cu un alt shell, eu folosesc un cârlig personalizat pentru cd / pushd / popd care îmi permite să fac cds 8 pentru a cd la orice se folosește dir-ul meu în fereastra 8 a ecranului. Acest lucru funcționează chiar și pentru shell-urile din afara sesiunii de ecran, atâta timp cât există o singură sesiune de ecran.

Comentarii

  • Al meu nu ‘ nu pare să fie ” configurat corect „. Multe dintre comenzile rapide pe care le văd aici nu funcționează ‘ nu funcționează, folosesc Terminalul stoc din Ubuntu 14.04. Cum îl pot configura?
  • @JorgeeFG: Cred că a funcționat pentru mine din cutie cu gnome-terminal în Ubuntu 14.04, înainte de a trece la KDE. Opțiunea relevantă este în setările terminalului dvs., esc-prefix vs hig h-bit și poate alte setări. Unii dintre ei nu ‘ nu funcționează perfect pentru mine prin ssh. (de exemplu, ctrl stânga / dreapta combină codul de evacuare pentru tasta săgeată și am 5D care apare literal)

Răspuns

Adăugați următoarele rânduri la ~/.inputrc

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

Acest lucru este similar cu răspunsul lui egmont, dar în loc să utilizeze Pagină sus și Pagină jos, folosește secvențele de evacuare pentru Săgeată sus și Săgeată jos. Acest mod este mult mai convenabil de utilizat pe un Mac.

Răspuns

Întotdeauna tind să-mi configurez mașinile cu un HISTSIZE , astfel încât să păstreze o listă mai lungă a istoricului, precum și HISTTIMEFORMAT cu valoarea marcajului de timp, astfel încât Văd când a fost executată comanda.

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

Răspuns

Mijloacele pe care le folosesc de obicei este să combin history cu grep

IE:

history | grep <command im looking for> 

Aceasta va afișa un istoric numerotat al comenzilor pe care le-ați introdus și care conțin acea comandă, apoi puteți utiliza:

!<number listed in history command> 

pentru a reface acea comandă.

IE:

history | grep history

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

urmat de: !571

va repeta history | grep history

Comentarii

  • CR = mult mai bine + mult mai sigur
  • Poate că, personal, găsesc un istoric canalizat către grep pentru a fi un mijloc mai rapid de a găsi majoritatea comenzilor. În ceea ce privește mai sigur, ‘ nu știu ce vrei să spui, care sunt riscurile inerente în utilizarea istoriei, așa cum se presupune căutarea prin ea cu cR?
  • @ Gravy Bănuiesc că PSkocik înseamnă că ! substituirea istoricului este mai puțin sigură.
  • @ Grevy Riscurile inerente ar fi obținerea accidentală a unei linii greșite. Nici o idee de ce terminalul dvs. a înghețat, cu excepția cazului în care ați folosit Control-S și ați activat controlul fluxului xon / xoff (adesea implicit). Dacă da, Control-Q îl va aduce înapoi.
  • Sunt de acord cu @PSkocik, cr este mult mai bun, deoarece ‘ s este mai ușor să editați linia istorică, mai degrabă decât să o rulați din nou în același mod. Executarea din nou a aceleiași comenzi este un caz banal a ceea ce puteți face pentru a economisi timp re-tastând variații pe un singur liner complex sau completarea unui tab diferit într-o cale lungă. Vedeți răspunsul meu.

Răspuns

Am folosit zilnic 4 sfaturi (și câteva altele) în terminalul meu bash:

  • Executați ultima comandă: !!

  • Executați comanda N din istoric: !N

  • Imprimați ultima comandă începând cu prefix din istorie: !prefix:p

  • Executați ultima comandă începând cu prefix din istorie: !prefix

Comentarii

  • Cred că folosirea comenzii N din istorie este una dintre cele mai mari căi de tragere în picior pentru majoritatea oamenilor 🙂 Doar spunând

Răspunde

Dacă este în regulă să utilizați zsh în loc de bash, puteți utiliza oh-mi-zsh pentru asta.

Puteți naviga în istoricul comenzilor cu săgețile sus și jos. De asemenea, permite aceeași navigare atunci când ați tastat deja textul (ca în Mathlab).

edit: Oh-my-zsh este un pachet software mare, orientat spre dezvoltatori, care include multe alte caracteristici, de ex aliasuri, teme, pluginuri. Aceste extras fac distribuția mai complexă de utilizat decât o comandă rapidă de la tastatură.

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

Comentarii

  • oh-my-zsh conține tone de lucruri. S-ar putea la fel de bine să spuneți: această caracteristică exactă este inclusă în acea distribuție, când tot ce aveți nevoie este o setare sau o aplicație specifică.
  • Am editat postarea: am avertizat că este mai mare decât o aplicație simplă.

Răspuns

Adăugați următorul alias la ~ / .bashrc

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

Utilizare: h fire îmi va oferi o listă de comenzi care conțin foc . sau h ^fire îmi va oferi o listă de comenzi care începe cu foc .

Acest lucru este util atunci când doresc să vizualizez o serie de comenzi în același timp.

Apropo, """"" este urât, dar nu am putut găsi alte modalități de a evita ghilimelele simple între ghilimelele unice.

Comentarii

  • fyi – h="history | awk '{\$1=\"\"; print}' ar trebui să funcționeze. alternativ creați o funcție și apelați-o.
  • mulțumesc DarkHeart, dar am încercat codul tău, nu am funcționat în mediul meu, poate există ceva diferit în al meu

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *