metti il ​​comando history sulla riga di comando senza eseguirlo


57

Uso! N dove (n) è il numero di riga per eseguire una riga nel file della cronologia che voglio eseguire al prompt dei comandi che trovo tramite la cronologia | less.

Ma c'è un evento storico della riga di comando che desidero modificare manualmente. Come posso inserire nella riga di comando un contenuto di eventi storici senza che sia effettivamente in esecuzione in modo da poterlo modificare e quindi premere Invio?

Migliore,

Risposte:


71

Per richiedere che il comando venga stampato anziché eseguito dopo la sostituzione della cronologia, aggiungere il :p modificatore , ad es !42:p. Anche il comando risultante verrà inserito nella cronologia, quindi è possibile premere Upper modificarlo.

Se hai l' histverify opzione set ( shopt -s histverify), avrai sempre l'opportunità di modificare il risultato delle sostituzioni della cronologia.

La funzione fcintegrata offre un accesso limitato all'espansione della cronologia (senza designatori di parole) e consente di modificare un comando precedente in un editor esterno.

È possibile utilizzare !prefixper fare riferimento all'ultimo comando che inizia con prefixe !?substringper fare riferimento all'ultimo comando che inizia con substring. Quando sai cosa stai cercando, questo può farti risparmiare molto tempo history | less.

Un altro modo per cercare nella cronologia precedente è la ricerca incrementale: premi Ctrl+ Re inizia a inserire una sottostringa di ciò che stai cercando. Premi Ctrl+ Rper passare alla ricorrenza precedente della stringa di ricerca finora e Ctrl+ Sse sei andato troppo lontano. La maggior parte dei tasti diversi da Ctrl+ R, Ctrl+ S, Backspacee personaggi ordinari terminare la ricerca incrementale e hanno il loro solito effetto (ad esempio i tasti freccia per spostare il cursore sulla riga che hai raggiunto, Enterper eseguire il comando).


C'è un refuso nel tuo primo esempio ...
pbm

9
Dovrai farlo stty -ixonprima che Ctrl-s funzioni.
Dennis Williamson,

@Dennis: Wow, i moderni emulatori di terminali non lo fanno per impostazione predefinita? <test> Hai ragione, anche gnome-terminal in Ubuntu ha il controllo del flusso!
Gilles 'SO- smetti di essere malvagio' il

Non so perché lo facciano ancora. È impossibile catturare qualcosa mentre scorre. Quando premi Ctrl-s, hai di nuovo un prompt. E le connessioni seriali lente sono per lo più un ricordo del passato.
Dennis Williamson,

Il punto su Dennis Ctrl-sè importante, altrimenti uno si blocca come ho fatto io .
imz - Ivan Zakharyaschev,

15

Un altro piccolo: Alt+#

commenta la riga corrente e la sposta nel buffer della cronologia.

Pertanto, quando si assembla una riga di comando e si deve emettere un comando temporaneo per trovare, ad esempio, un file, è sufficiente premere Alt+ #, immettere l'altro comando, passare alla cronologia, rimuovere il commento e procedere.


2
Inoltre Esc, #funziona
Steven Penny l'

e puoi effettivamente digitarlo su un mac (tieni premuto MAIUSC, premi ESC e # insieme), a differenza dell'altro combo ket (fn + alt +
maiusc

7

Puoi usare lo spazio magico per espandere la cronologia prima di premere invio. Nel tuo .inputrc, associa lo spazio allo spazio magico:

$if Bash
     Space: magic-space
$endif

Ora, ogni volta che si digita uno spazio dopo una specifica della cronologia, verrà immediatamente espanso: utile se si desidera modificarlo anche!



4

Usando Ctrl+rpuoi cercare la cronologia:

pbm@tauri ~ $ 
(reverse-i-search)`xran': xrandr -o normal

Qualsiasi comando che trovi potrebbe essere modificato ...


Penso di aver trovato esattamente ciò di cui hai bisogno: corri shopt -s histverifye la prossima volta che vuoi usare il !ncomando non verrà eseguito ma messo solo alla riga di comando ...


Devi eseguire un comando prima di poterlo cercare con Ctrl + r, non quello che Vass chiede.
phunehehe,

1
Non capisco come questo non faccia quello che chiede. Vorrei aggiungere che se si desidera modificare il comando prima di eseguirlo, è possibile semplicemente premere TAB una volta trovato il comando giusto.
Steven D,

2
Quindi la procedura sarebbe, (1) Ctrl + r, (2) digitare fino a trovare il comando, (3) TAB, (4) comando di modifica, (5) INVIO.
Steven D,

1
@phuenhehe: "Ma c'è un evento storico della riga di comando che desidero modificare manualmente"
pbm

1
Non !n:pfunziona?
alex,

1

L'ho voluto spesso. Quando ho usato csh (e tcsh), ho avuto un linguaggio:
!:88*:p

Questo idioma inserisce "parola 88 attraverso l'ultima parola" del comando precedente nel punto in cui si sta digitando sulla riga di comando corrente, che in genere è la fine. In csh, non è un errore che una tale espressione non produca parole. Cioè, non c'è bisogno che ci sia una parola 88, né nessuno che la segua. Se non è presente alcuna parola 88, ciò non aggiunge parole alla fine del comando che viene digitato, quindi inserisce la riga di comando risultante nella cronologia senza esecuzione.

Come probabilmente saprai,
*! (come !! e! -1) è il comando precedente;
*: 88 è la parola 88 (la prima parola - in genere il comando - è zero) e csh richiederebbe l'esistenza di tale parola, ma ...
*: 88 * sono tutte le parole che iniziano alla parola 88, e quindi csh lo fa non richiede che la parola esista;
*: p significa stampa, ma non esegue la riga di comando.
Con o senza: p, la riga di comando viene aggiunta alla cronologia dei comandi.

"Perché 88?" ti chiedi? Perché è la stessa chiave del * avrò bisogno. Se hai comandi così lunghi, forse!: 888 *: p è quello che ti serve. Spiacenti, non funziona con bash AFAIK. Bash dirà semplicemente bash: :88*: bad word specifier

Curiosità: il tuo comando di solito non deve essere il primo.
> /tmp/foo echo My command is word 3
è valido in bash e csh.


Poiché la domanda è taggata per bash, potrebbe essere utile iniziare dicendo che la soluzione funziona solo in (t) csh.
Zagrimsan,

0

Normalmente uso Ctrl+ rper cercare e poi Ctrl+ eper andare alla fine della riga senza eseguire.



@JeffSchaller Non lo vedo. Vedo il riferimento CTRL + R. Da dove non vedo CTRL + E che è il pezzo mancante del puzzle nei post precedenti.
nikc,
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.