risposta-alla-domanda-sullo-sviluppo-web-bd.com

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 immettiamo qualcosa e poi premiamo i tasti freccia, scorriamo solo tra i comandi della cronologia a partire da ciò che abbiamo inserito. È davvero conveniente, ma in un terminale Shell non funziona.

Esiste un modo per ottenere una funzione simile in un terminale Shell? E altri suggerimenti per migliorare l'efficienza nell'uso dei terminali?

74
Lee

Quello che stai cercando è CtrlR.

Genere CtrlR e quindi digitare parte del comando desiderato. Bash mostrerà il primo comando corrispondente. Continua a digitare CtrlR e bash scorrerà i precedenti comandi corrispondenti.

Per cercare all'indietro nella cronologia, digitare CtrlS anziché. (Se CtrlS non funziona in questo modo, probabilmente significa che è necessario disabilitare il controllo del flusso XON/XOFF: per farlo, eseguire stty -ixon.)

Questo è documentato in "Ricerca" in man bash.

109
John1024

Inseriscili nel tuo ~/.inputrc:

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

Questi fanno Page Up e Page Down comportati come desideri. (Alcune distribuzioni lo hanno già configurato per te.) Personalmente trovo questo modo più conveniente di Ctrl+R o history.

33
egmont

Oltre alla storia di ^ r/^ i-search:

alt. inserisce l'ultima "Parola" del comando precedente sul cursore. Ripetilo per ottenere l'ultima parola dai comandi più vecchi. (Nota che un & Finale è considerato l'ultima parola per i comandi in background).

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

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


Se il terminale è impostato in modo corretto/corretto, ctrl-sinistra e ctrl-destra andranno avanti/indietro di parole. Altrimenti, si spera che almeno alt-b e alt-f facciano la stessa cosa.


ctrl-/è un annullamento. È possibile utilizzare la ripetizione automatica per eliminare le parole in modo molto più efficiente se è possibile annullare quando si supera un po 'di tempo.


Il mixaggio/abbinamento più potente dei comandi deriva dall'uso del kill-ring, che funziona proprio come in Emacs. ctrl-y per incollare l'ultimo ctrl-w/ctrl-u/ctrl-backspace/alt-d. alt-y per scorrere il testo ucciso più vecchio.

Più ctrl-w o qualsiasi altra cosa in una riga compongono la voce kill-ring. Utilizzare la freccia sinistra e destra o qualcosa per spezzare la voce se si desidera rimuovere due elementi e incollarne uno solo in seguito.

Combinando tutti questi insieme, puoi

  • inizia a digitare un comando
  • ctrl-r per tornare a un vecchio comando e afferrarne una parte con control-w o simile.
  • esc-r o alt+r per ripristinarlo com'era prima di eliminarne una parte.
  • alt - > per andare alla fine della storia (cioè freccia giù fino in fondo), per tornare al comando in cui ti trovavi nel mezzo.

Altri suggerimenti per l'uso interattivo:

Abilita shopt -s globstar, In modo da poter eseguire **/*.c (Ricorsivo inclusa la directory corrente). A volte utile per l'uso interattivo, ma di solito find -name '*.c' -exec foo {} + È meglio.

Se scrivi script bash, ti sarà utile avere abilitato shopt -s extglob Anche nelle tue shell interattive. A volte a volte troverai un uso per cose come *.!(c|h) per abbinare i file che non finiscono con .c o .h.

Trova gli alias che ti piacciono per ls -l, less e qualsiasi altra cosa che fai molto. (cp -i, mv -i E rm -I Sono carini. Non prendere l'abitudine di a seconda di su di loro di fare un rm selettivo GNU rm's -Io chiedo una volta per tutte le discussioni.)

Mi piace alias m=less (M per "altro"). Ho less impostato con , e . associato al file precedente/successivo (lesskey). L'impostazione predefinita è una sequenza multi-tasto che non può essere utilizzata con autorepeat.


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

Per ottenere qualcosa di simile alla funzionalità di apertura di una nuova Shell con lo stesso cd di un'altra Shell, uso n hook personalizzato per cd/pushd/popd che mi permette di fare cds 8 Per cd in qualunque directory Shell nella finestra dello schermo 8 sta usando. Funziona anche con shell al di fuori della sessione dello schermo, purché ci sia solo una sessione dello schermo.

10
Peter Cordes

Aggiungi le seguenti righe al tuo ~/.inputrc

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

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

7
John Slavick

Tendo sempre a configurare le mie macchine con un grande valore HISTSIZE in modo da mantenere un elenco cronologico più lungo, così come HISTTIMEFORMAT con il valore del timestamp in modo da poter vedere quando è stato eseguito il comando.

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

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

IE:

history | grep <command im looking for>

Verrà visualizzata una cronologia numerata dei comandi digitati che contengono quel comando, quindi puoi 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

3
Gravy

Se per te va bene usare zsh invece di bash, puoi usare oh-mi-zsh per questo.

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

modifica: Oh-my-zsh è un pacchetto software di grandi dimensioni 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

2
user9869932

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

  • Esegui l'ultimo comando:!!

  • Esegui comando [~ # ~] n [~ # ~] dalla cronologia:!N

  • Stampa l'ultimo comando che inizia con prefisso dalla cronologia:!prefix:p

  • Esegui l'ultimo comando che inizia con prefisso dalla cronologia:!prefix

2
Nolwennig

Aggiungi il seguente alias a ~/.bashrc

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

Utilizzo: h fire mi porterà un elenco di comandi contenenti fuoco. o h ^fire mi porterà un elenco di comandi che iniziano con fuoco.

Questo è utile quando voglio visualizzare una serie di comandi contemporaneamente.

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

1
Hosi Golden