Cerca un comando precedente con il prefisso che ho appena digitato

Possiamo usare le frecce su e giù per navigare nella cronologia dei comandi.

In alcuni IDE, come Matlab, se inseriamo qualcosa e poi premiamo i tasti freccia, scorriamo solo tra i comandi della cronologia iniziando da ciò che abbiamo input. È davvero comodo, ma in un terminale di shell non funziona.

Esiste un modo per ottenere una funzione simile in un terminale di shell? E qualche altro suggerimento per migliorare lefficienza nelluso del terminale?

Commenti

  • Potresti semplicemente usare una shell che fornisce tale funzionalità, come fish😉
  • @yoann tu ‘ presumendo che bash non ‘ t . Tramite readline, semplicemente non è accessibile per impostazione predefinita.
  • @muru I ‘ conosco CTRL + R in bash e egmont fornisce un modo accurato per farlo con Pagina su / Pagina giù. Tuttavia, esiste un modo per farlo con i tasti freccia?
  • @yoann controlla unix.stackexchange.com/a/76591/70524. Invece di \e[5~ e \e[6~, utilizza \e[A, \e[B.

Risposta

Quello che stai cercando è Ctrl R .

Digita Ctrl R e poi digita parte del comando che desideri. Bash mostrerà il primo comando corrispondente. Continua a digitare Ctrl R e bash scorrerà i precedenti comandi corrispondenti.

Per cercare allindietro nella cronologia, digita Ctrl S invece. (Se Ctrl S non funziona in questo modo, probabilmente significa che devi disabilitare il controllo del flusso XON / XOFF: per farlo, esegui stty -ixon.)

Questo è documentato in “Ricerca” in man bash.

Commenti

  • Ctrl-Q per uscire dallo stato congelato, se hai già premuto Ctrl-S senza prima disattivare il controllo del flusso e bloccare il terminale.

Rispondi

Inseriscili nel tuo ~/.inputrc:

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

Questi fanno Pagina su e Pagina giù si comporta come desideri (alcune distribuzioni lo hanno già configurato per te.) Personalmente trovo questo modo più conveniente di Ctrl + R o history.

Commenti

  • Questo è il modo più conveniente per tutte le risposte correnti. Potrebbe u plz dare un po spiegazione sul meccanismo di funzionamento?
  • ~/.inputrc o /etc/inputrc o il file a cui fa riferimento la variabile di ambiente $INPUTRC è il file di configurazione per la modifica della riga di tutte le applicazioni che utilizzano readline, inclusa bash (la tua shell). Ha alcune capacità di modifica di riga incorporate, incluse queste due: nella pagina di manuale di bash ‘ cercare una di queste parole chiave per saperne di più. \e[5~ / \e[6~ sono le sequenze di escape generate dai tasti Pagina su / giù nella maggior parte degli emulatori di terminale; per vederlo, lancia il comando cat e poi premi questi tasti (il byte di escape è rappresentato nel terminale come ^[, in inputrc come \e).
  • Lesempio nella tua domanda originale dice che i tasti Su / Giù funzionano in questo modo in Matlab. Sarebbe interessante vedere cosa sarebbe successo se si inserisse la sequenza di Su e Giù in inputrc e si assegnasse a questa azione; funzionerebbe correttamente o avrebbe effetti collaterali negativi in quanto è in conflitto con il loro comportamento predefinito. Non ‘ non lo so, ‘ sarei felice di conoscere i tuoi risultati se ci provi.
  • Quando faccio echo $INPUTRC è vuoto. ‘ utilizzo Ubuntu 14.04
  • Personalmente preferisco sovrascrivere le frecce su e giù per farlo: "\e[A": history-search-backward e "\e[B": history-search-forward

Risposta

Oltre a ^ r / ^ s history i -search:

alt . inserisce lultima “parola” del comando precedente nel cursore. Ripeti per ottenere lultima parola dai comandi precedenti. (Ma tieni presente che un & finale conta come lultima parola per i comandi in background).

Questo è molto utile per mkdir foo, cd punto alternativo. Ancora più veloce della freccia su, ^ a, alt-d (elimina la parola in avanti), cd.

Per ottenere la penultima parola, usa esc - 2 alt+. (cioè usa un argomento numerico in stile emacs per alt+..Il negativo conta dalla fine, il positivo conta in avanti dallinizio.) Ma questo di solito è più un problema di quanto valga; a un certo punto è più veloce raggiungere il mouse e copiare / incollare, o freccia su e ^ con ^ y parte di esso (vedi sotto).


Se il tuo terminale è impostato bene / correttamente, ctrl-sinistra e ctrl-destra andranno avanti / indietro per parole. In caso contrario, si spera che almeno alt-be alt-f facciano la stessa cosa.


ctrl- / è un annullamento. Puoi utilizzare la ripetizione automatica per eliminare le parole in modo molto più efficiente se puoi annullare quando esegui un eccesso di un po .


Un mix / abbinamento più potente dei comandi deriva dalluso del kill-ring, che funziona proprio come in Emacs. ctrl-y per incollare lultimo ctrl-w / ctrl-u / ctrl-backspace / alt-d. alt-y per scorrere il testo ucciso più vecchio.

Ctrl-w multiplo o qualsiasi altra cosa in una riga fa sulla voce kill-ring. Usa le frecce sinistra e destra o qualcosa del genere per suddividere la voce se desideri rimuovere due elementi e incollarne solo uno in seguito.

Combinando tutti questi elementi insieme, puoi

  • inizia a digitare un comando
  • ctrl-r per tornare a un vecchio comando e prenderne una parte con control-w o simili.
  • esc-r o alt+r per ripristinarlo comera prima di eliminarne parte.
  • alt- > per andare alla fine della cronologia (cioè con la freccia verso il basso fino in fondo), per tornare al comando a cui eri nel mezzo.

Altri suggerimenti per luso interattivo:

Abilita shopt -s globstar, in modo da poter eseguire **/*.c (ricorsivo includendo lattuale dir). A volte è utile per luso interattivo, ma di solito find -name "*.c" -exec foo {} + è migliore.

Se scrivi script bash, troverai utile shopt -s extglob abilitato anche nelle tue shell interattive. a volte troverai un uso per cose come *.!(c|h) per trovare file che non finiscono con .c o .h.

Trova gli alias che ti piacciono per ls -l, less e qualsiasi altra cosa che fai Un sacco. (cp -i, mv -i e rm -I sono carini. Non prendere labitudine di dipendere da loro per eseguire un rm selettivo. GNU rm “s – Chiedo una volta per tutti gli argomenti.)

Mi piace alias m=less (m per “altro”). Ho less configurato con , e . associato al file precedente / successivo (lesskey). Limpostazione predefinita è una sequenza di più tasti che non può essere usata con lautorepeat.


Mi piace fare tutto allinterno dello schermo GNU. Trovo più facile tenere traccia delle finestre dello schermo numerate rispetto a un sacco di schede in Konsole (o qualsiasi altro emulatore di terminale che ho provato). Se non conosci già screen, impara tmux perché è più recente e meno complicato.

Per ottenere qualcosa di simile alla funzionalità di apertura di una nuova shell con lo stesso cwd di unaltra shell, utilizzo un hook personalizzato per cd / pushd / popd che mi permette di fare cds 8 per cd su qualsiasi cosa dir la mia shell nella finestra dello schermo 8 sta usando. Questo funziona anche per le shell al di fuori della sessione dello schermo, purché ci sia una sola sessione dello schermo.

Commenti

  • Il mio ‘ non sembra essere ” configurato correttamente “. Molte delle scorciatoie che vedo qui non ‘ funzionano, sto usando il terminale stock di Ubuntu 14.04. Come posso configurarlo?
  • @JorgeeFG: Penso che abbia funzionato per me immediatamente con gnome-terminal in Ubuntu 14.04, prima di passare a KDE. Lopzione pertinente è nelle impostazioni del tuo terminale, esc-prefix vs hig h-bit, e forse alcune altre impostazioni. Alcuni di loro non ‘ funzionano perfettamente per me tramite ssh. (es. ctrl sinistra / destra munge il codice di escape per il tasto freccia, e ottengo 5D che appare letteralmente)

Risposta

Aggiungi le seguenti righe al tuo ~/.inputrc

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

È simile alla risposta di egmont, ma invece di usare Pagina su e Pagina giù, utilizza le sequenze di escape per Freccia su e Freccia giù. In questo modo è molto più comodo da usare su un Mac.

Risposta

Tendo sempre a configurare le mie macchine con un grande HISTSIZE in modo da mantenere un elenco della cronologia più lungo, oltre a HISTTIMEFORMAT con il valore del timestamp in modo Posso vedere quando è stato eseguito il comando.

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

Risposta

Il mezzo che di solito uso è combinare history comando con grep

IE:

history | grep <command im looking for> 

Verrà visualizzata una cronologia numerata dei comandi che hai digitato che contengono quel comando, puoi quindi utilizzare:

!<number listed in history command> 

per ripetere quel comando.

IE:

history | grep history

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

seguito da: !571

ripeterà history | grep history

Commenti

  • CR = molto meglio + molto più sicuro
  • Forse, personalmente trovo che una cronologia inviata a grep sia un mezzo più veloce per trovare la maggior parte dei comandi. Per quanto riguarda Safer, ‘ non sono sicuro di cosa intendi, quali sono i rischi intrinseci nellutilizzo della cronologia rispetto alla ricerca attraverso di essa con cR?
  • @ Sugo Sospetto che PSkocik significhi che la ! sostituzione della cronologia è meno sicura.
  • @Gravy I rischi intrinseci sarebbero accidentalmente sbagliare la linea. Non ho idea del motivo per cui il tuo terminale si sia bloccato, a meno che tu non abbia usato Control-S e non hai abilitato il controllo del flusso xon / xoff (spesso limpostazione predefinita). Se è così, Control-Q lo riporterà.
  • Sono daccordo con @PSkocik, cr è molto migliore perché ‘ s più facile modificare la riga della cronologia, piuttosto che eseguirla di nuovo nello stesso modo. Eseguire di nuovo lo stesso identico comando è un caso banale di ciò che puoi fare per risparmiare tempo nella riscrittura di variazioni su linee singole complesse o nel completamento con tabulazione di un file diverso in un lungo percorso. Vedi la mia risposta.

Risposta

Ho usato 4 suggerimenti al giorno (e alcuni altri) nel mio terminale bash:

  • Esegui lultimo comando: !!

  • Esegui comando N dalla cronologia: !N

  • Stampa lultimo comando che inizia con il prefisso dalla cronologia: !prefix:p

  • Esegui lultimo comando che inizia con prefisso dalla cronologia: !prefix

Commenti

  • Penso che usare il comando N dalla cronologia sia uno dei i più grandi percorsi in assoluto per spararsi ai piedi per la maggior parte degli umani 🙂 Solo dicendo

Risposta

Se va bene che tu usi zsh invece di bash, puoi usare oh-mi-zsh per quello.

Puoi navigare nella cronologia dei comandi con le frecce su e giù. Consente anche la stessa navigazione quando hai già digitato il testo (come in Mathlab).

edit: Oh-my-zsh è un grande pacchetto software orientato agli sviluppatori che include molte altre funzionalità, ad es alias, temi, plugin. Questi extra rendono la distribuzione più complessa da usare rispetto a una scorciatoia da tastiera.

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

Commenti

  • oh-my-zsh contiene tonnellate di cose. Potresti anche dire: questa caratteristica esatta è inclusa in quella distribuzione, quando tutto ciò di cui hai bisogno è unimpostazione o unapp specifica.
  • Ho modificato il post: ho avvertito che è più grande di una semplice app.

Risposta

Aggiungi il seguente alias a ~ / .bashrc

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

Utilizzo: h fire mi fornirà un elenco di comandi contenenti fuoco . oppure h ^fire mi farà ottenere un elenco di comandi che iniziano con fire .

Questo è utile quando voglio visualizzare una serie di comandi allo stesso tempo.

A proposito, """"" è brutto ma non sono riuscito a trovare altri modi per evitare virgolette singole tra virgolette singole.

Commenti

  • fyi – h="history | awk '{\$1=\"\"; print}' dovrebbe funzionare. In alternativa, crea una funzione e chiamala.
  • grazie DarkHeart, ma ho provato il tuo codice, non ha funzionato nel mio ambiente, forse cè qualcosa di diverso nel mio

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *