Con BASH dopo aver "fatto scorrere" fino a un comando precedente ... come passare al successivo in questa cronologia?


59

Mi scuso, questo titolo non è il più elegante che abbia mai ideato.

Ma suppongo che molte persone si saranno chieste questo, e la mia domanda potrebbe essere un inganno ... tutto quello che posso dire è che non l'ho trovato.

Quando dico "scrolling" verso l'alto, intendo usare il tasto "freccia su" sulla tastiera, che ovviamente ti fa scorrere in alto nella cronologia, iniziando dal comando più recente.

Quindi trovi un comando forse 30 comandi indietro ... e lo esegui. E poi vuoi eseguire il comando che originariamente è venuto dopo di esso ... c'è un modo scattante di farlo? O come fanno quelli che parlano fluentemente BASH?

Risposte:


96

L'esecuzione del comando con Ctrl+ oinvece di Entereseguirà un comando dalla cronologia, quindi metterà in coda quello successivo invece di tornare all'inizio della cronologia bash.


2
Ho appena provato questo nel mio bash in esecuzione in un xterm su NetBSD, e non funziona! Ci sono impostazioni che possono influenzare questo? Non ho file .inputrc. Co non è menzionato nella pagina di manuale per readline (3).
Rhialto,

@Rhialto Stai utilizzando la vimodifica della riga (abilitata con set -o vi) o emacs? Perché Ctrl-Onon funzionerà con il primo per quanto ne so.
B Layer,

... ma questo può essere risolto con il comando: bind "\C-o":operate-and-get-next(o aggiungi tutto dopo binda ~/.inputrc)
B Layer

1
Ho scoperto qual è il mio problema: ^ O è considerato il carattere Flush Output (non supportato su Linux) e readline non lo disabilita mentre è attivo. Ho fornito una semplice patch ma il manutentore bash e readline sostiene che questo non è un bug. Non sono d'accordo. Vedi lists.gnu.org/archive/html/bug-readline/2018-01/msg00004.html
Rhialto

19

La risposta di Jon Reinhold è ottima, ma c'è una soluzione molto più potente che suggerirò. Ho anche un commento su un gotcha nella risposta di Jon, ma non ho abbastanza reputazione per poter commentare direttamente, quindi @Jon Reinhold, se leggi questo, ti preghiamo di rivolgermi al mio commento qui sotto.

Bash include un comando fc, che accetta come parametri numeri di riga dell'elenco della cronologia di bash. Quindi apre l'editor predefinito con quelle righe come testo. A quel punto, puoi facoltativamente modificare le linee. Quindi, quando esci dall'editor, bash esegue quelle righe!

Un esempio di modifica che potresti voler fare è aggiungere a tutti tranne l'ultima riga qualcosa come "; read -p" next ... ". Questo farà sì che bash esegua ogni riga e ti chiederà prima di continuare.

Commento per Jon Reinhold: Ottima risposta, ma dovresti qualificarla perché se l'utente ha impostato la variabile bash HISTCONTROL da includere erasedups, dopo aver eseguito C-ol'utente sarà confuso perché al posto del comando successivo atteso nella cronologia visualizzato, quello successivo a quello sarà mostrato. Questo perché bash ha eliminato l'istanza originale del comando eseguito, e quindi tutti i comandi in seguito si sono spostati di una riga, ad es. a un numero di indice inferiore nell'elenco cronologico.


grazie, nel tentativo di trovare la risposta cercando ho trovato il comando "fc". Per me questo rappresenta il prossimo stadio dei lenti passi di un bambino del neofita BASH lungo il cammino della gloria verso la CONOSCENZA. Volevo il primo piccolo passo.
mike rodent,

3
@mikerodent No. Quindi succede prima e fcsia . (Contrariamente a questa risposta è anche meno utile.)Ctl-obash
kubanczyk,

1
Il problema con erasedupsè chiaramente un bug bash ( potrebbe esserci stato un accantonamento per questa situazione). Buono a sapersi, però.
alexis,

2
@kubanczyk Questo è in discussione. Se si tratta di un comando complesso e complicato a seconda di ciò che deve essere risolto, sarebbe molto più veloce per me utilizzare il mio editor preferito per aggiornare il comando. Sarebbe anche più facile.
Pryftan,

14

Un altro modo per realizzare il vostro comportamento desiderato sarebbe quello di acquisire familiarità con le scorciatoie bash readline (di cui CTRL- oè uno credo) e la storia bash ricerca.

Ricerca nella storia

CTRL- rti porta nella ricerca della cronologia dei comandi di bash, dove puoi iniziare a digitare il comando che stai cercando e bash completerà automaticamente il comando per te. La funzionalità di completamento automatico è davvero piuttosto buona. Quando il comando che si desidera eseguire si trova sulla riga di input, è possibile ENTEReseguire il comando o premere CTRL- eper spostare il cursore alla fine della riga di comando e uscire dalla modalità di ricerca della cronologia.

La cosa interessante di CTRL- ea questo punto è che il buffer della cronologia è impostato contestualmente su questo comando. I comandi successivo e precedente ora sono quelli eseguiti appena prima e dopo la riga individuata dalla ricerca cronologica. Puoi premere le frecce su o giù e prendere il comando successivo.

La ricerca della cronologia è molto potente e un ottimo modo per evitare di usare la freccia su per tornare al comando in primo luogo. Una rapida ricerca nella cronologia può farti risparmiare un sacco di tempo cercando manualmente la cronologia e quindi puoi procedere CTRL, ocome Jon ha sottolineato sopra.

Shortline Readline

Se stai cercando di aumentare il tuo bash-fu generale, ti consiglierei di dare un colpo alle scorciatoie readline per i tasti freccia. Potresti scoprire che sono più convenienti e ti consentono di aumentare la velocità di digitazione, ma ovviamente YMMV. Eccone qualcuno in più:

  1. CTRL- nper il comando successivo (equivalente freccia giù)
  2. CTRL- pper il comando precedente (freccia su equivalente)
  3. CTRL- bindietro un carattere (equivalente freccia sinistra)
  4. CTRL- finoltra un carattere (equivalente freccia destra)

Queste scorciatoie readline (insieme a CTRL- ainizio della riga e CTRL- efine della riga) aumenteranno la velocità e l'efficienza nella riga di comando imo.


2
Non lo so. Trovo che l'uso dei tasti modificatori sia più lento delle frecce o di qualsiasi altro tasto singolo premuto. Per quanto riguarda EOL / ecc. Tendo a usare i tasti home / end (stty -a mostra anche alcune cose piuttosto utili, ovviamente).
Pryftan,

@Pryftan Abbastanza giusto, l'ultima frase è presentata come un'opinione (vedi 'imo'). Credo che rimanere sulla riga home della tastiera a lungo raggio sia una buona strategia per lavorare nel terminale o qualsiasi altra attività di digitazione intensiva. Alcune persone hanno tastiere in cui i tasti freccia sono più vicini agli altri caratteri, in quel caso forse le scorciatoie readline non sono una comodità convincente. Modificherò la risposta per rendere più chiaramente quest'ultimo punto una dichiarazione di opinione.
111 ---

1
@datUser Tbh ​​Mi è mancato il 'imo' (o se non lo avessi trascurato di considerarlo - del tutto possibile). Ciò che è vero è che la ricerca inversa è utile (avere un +1) se funziona per te. Naturalmente anche fc è qualcosa (come già notato) e così sta usando! (eccetera.). Tanti modi per scuoiare un gatto in Unices. Anche per quanto riguarda le tastiere è abbastanza vero: ho una tastiera Unicomp (la adoro e riporta ricordi) ma ovviamente ci sono anche altre tastiere da considerare per non parlare di Dvorak. Alla fine, più opzioni hai, migliore sarà il tuo lavoro e più facile sarà il tuo lavoro (o il tuo gioco) :)
Pryftan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.