Esiste un modo per eseguire comandi dalla cronologia?


99

Per esempio:

[root@ip-10-0-7-125 ~]# history | grep free
  594  free -m
  634  free -m | xargs | awk '{print "free/total memory" $17 " / " $ 8}'
  635  free -m
  636  free -m | xargs | awk '{print "free/total memory" $9 " / " $ 10}'
  736  df -h | xargs |  awk '{print "free/total disk: " $11 " / " $9}'
  740  df -h | xargs |  awk '{print "free/total disk: " $11 " / " $8}'
  741  free -m | xargs | awk '{print "free/total memory: " $17 " / " $8 " MB"}'

Mi chiedo solo se esiste un modo per eseguire il comando 636 senza digitarlo di nuovo, basta digitare qualcosa più il numero, come la cronologia 636 o qualcosa del genere.



1
Sì, lo so ma non è esattamente quello che voglio.
The One

Risposte:


171

A bash, !636andrà bene.


12
In Linux- Ciò ha più a che fare con la shell (bash, zsh, ecc.) Che una persona sta eseguendo quindi il sistema operativo su cui la stai eseguendo. Ci sono shell su Linux senza supporto per la cronologia.
Zoredache,

@Zoredache E allo stesso modo, questo funziona bene nella maggior parte delle implementazioni di bash su Windows.
Ajedi32

1
Non solo bash, ovviamente, ma anche altre shell - incluso csh.
Estratto il

5
Se hai un comando molto simile a quello che vuoi eseguire, puoi aggiungere :pper stampare il comando senza eseguirlo, !636:pper esempio. Ciò significa che puoi selezionarlo di nuovo facilmente dalla cronologia premendo la freccia su e apportare le modifiche minori desiderate
AJefferiss

78

Sì, si chiama "espansione della storia". Vedere

LESS='+/^HISTORY EXPANSION' man bash

per tutti i dettagli.

L'uso di un punto esclamativo seguito da un numero è probabilmente l'uso più semplice:

!636

Tuttavia, puoi anche eseguire direttamente l'ultimo comando eseguito senza conoscerne il numero storico:

!!

Oppure puoi eseguire due comandi indietro:

!-2

Il modulo che utilizzo più spesso, tuttavia, è ripetere l'ultimo argomento dell'ultimo comando:

echo this text goes into a file > /tmp/afile.txt
cat !$

O, diciamo, sto ispezionando un file. Utilizzando il completamento della scheda, potrei fare quanto segue:

ls -l /really/long/path/to/some/file
less !$

Ancora una volta, leggi la pagina man per maggiori dettagli:

LESS='+/^HISTORY EXPANSION' man bash

25
Interattivo, Alt-.può essere più conveniente di !$. Inserisce l'ultimo argomento dell'ultimo comando alla lettera .
Ulidtko

2
@ulidtko Dove sono documentate quelle fughe speciali (di cui ero a conoscenza !$, ma di cui non avevo mai sentito parlare Alt-.)? Pubblicherai un link ad esso, per favore?
edmz,

5
LESS="+/DEFAULT KEY BINDINGS" man 3 readline, /etc/inputrc, ~/.inputrc. Molti programmi oltre a bash usano libreadline; per coloro che lo fanno, si ottiene le stesse caratteristiche come Alt-., Ctrl-X-U(undo), Ctrl-/(descrivere scorciatoia), scheda di completamento, ecc - gratis. Ad esempio, con solo tre righe di PYTHONSTARTUPuna puoi abilitare il completamento delle schede e la cronologia nel REPL di Python di serie . Che funzionerà (principalmente) lo stesso di bash, poiché è la libreria GNU Readline che fa il lavoro. La manpage di readline descrive le caratteristiche in dettaglio.
ulidtko,

2
Inoltre, Ctl-UpArrow (o AltUpArrow su bash) scorrerà all'indietro l'elenco della cronologia. Digitando alcuni caratteri, UpArrow ottiene solo i comandi che iniziano con quella lettera, ad es. "Fr (Ctl-Up)" scorre tutti i comandi "free ..." nell'elenco dei PO. Questo funziona anche in cose come gnuplot e gdb che usano readline.
jamesqf,

2
@ Ajedi32, vedi l'ultima riga in grassetto nella mia risposta. :) Sinceramente questa risposta è a malapena un assaggio di ciò che l'espansione della storia può fare . Tieni presente che questo è a livello della shell, non del comando che stai chiamando; quindi echo {1..5}seguito touch !$toccherà cinque file, non solo uno. Quindi, a rigor di termini, non è l'ultimo argomento, ma l'ultima parola della shell su quella riga. (Prova anche echo hello >tempseguito da echo goodbye !$.) Se riesci a pensare a un modo per dirlo più chiaramente, sentiti libero di suggerire una modifica.
Wildcard

14

Bello, se non vuoi fare la prima cronologia, prendi nota del numero, ecc.:

in bash (e forse altri):

ctrl-r something 

( ctrl-r= "ricerca inversa in modo interattivo") ( something= una parte di un comando precedente)

Questo ti mostrerà l'ultima riga della cronologia contenente something. Per ottenere quello precedente, fai di nuovo ctrl-r (da solo), ogni volta che ottiene una riga precedente.

ex:

ctrl-r  10

per mostrare l'ultima riga della cronologia contenente '10' (ad esempio la riga con $10, nel tuo esempio) e di ctrl-rnuovo fino a quando non recuperi la riga della cronologia che stavi cercando

Quando appare la linea si voleva, solo Enterper farlo funzionare (o si può anche modificarlo, utilizzando la arrow keys, backspacee ctrl-aper andare all'inizio della riga, ctrl-eper arrivare alla fine, ctrl-k: a "uccidere" dal cursore alla fine della riga (= elimina + lo salva in un buffer),: ctrl-yper ripristinare, dal buffer, un bit precedentemente ucciso, ecc.)

Se vuoi cercare in avanti (ctrl-s), devi prima disabilitare XON : vedi https://stackoverflow.com/a/791800/1841533 :

"solo per disabilitare XON / XOFF eseguendo

stty -ixon

"(e quindi sarai in grado di usare ctrl-s, senza che si blocchi il terminale)


Se lo faccio e premo accidentalmente ctrl-r una volta troppe, c'è un modo per cercare di nuovo in avanti nella cronologia?
Kasperd,

@kasperd: Sì, puoi. molte risposte su se lo sottolinea: ctrl-s per la ricerca in avanti.
Olivier Dulac,

Sfortunatamente ctrl-s viene utilizzato per bloccare il terminale e bash non lo disabilita, quindi non funziona nella configurazione predefinita. (Altri programmi - come emacs - disabilitano l'associazione dei tasti per bloccare il terminale in modo tale che ctrl-s possa essere usato per la ricerca.)
kasperd

@kasperd: Sì, scusami per non averlo menzionato prima (ho indicato "molte risposte" perché lo fanno con precisione, ma non mi sono preso il tempo di scrivere questo nel commento o dare un link ... (Stavo usando il mio telefono). Ora sono tornato a casa e ho potuto modificarlo nella risposta sopra. ctrl-s per la ricerca della storia bash ha bisogno che tu stty -ixon prima
Olivier Dulac

Questo comando interromperà il normale utilizzo di ctrl-s, quindi non è proprio un'opzione.
Kasperd,

7

Puoi usare la shell builtin fc :

fc -s 636

2
Questo è in realtà migliore della risposta accettata, ma è necessario rimuovere il -sper ottenere i benefici. Se esegui fc 636, aprirai un editor con il comando 636 della cronologia nel buffer e quando salvi e chiudi il comando (modificato o meno) verrà eseguito. E ancora meglio, questo è conforme a POSIX .
Carattere jolly

@StevenPenny Grazie. E sì, so cos'è POSIX, anche se non vedo la rilevanza. Indipendentemente da ciò, alcuni documenti facilmente accessibili e inclusi sarebbero utili.
Faheem Mitha,

@FaheemMitha prova a eseguire "help fc."
Wildcard l'

@Wildcard helpnon è POSIX - potrebbe essere necessario man dasho simile
Steven Penny,

@Wildcard Grazie. Tendo a dimenticare che helpesiste. Un'altra shell integrata. E sconcertante per gli utenti incauti che potrebbero desiderare aiuto con un nuovo sistema, ma invece devono confrontarsi con un flusso di incomprensioni. :-(
Faheem Mitha

3

C'è HSTR- hhcomando per bashe zshselezione interattiva dei comandi, meglio della ricerca inversa Ctrl-R:

hh esempio di comando storico interattivo

è interattivo, quindi è possibile cercare e modificare il comando prima di eseguirlo.

Su Ubuntu, puoi installare hhcon il seguente one-liner:

sudo add-apt-repository ppa:ultradvorka/ppa && sudo apt-get update && sudo apt-get install hh && hh --show-configuration >> ~/.bashrc

o passo dopo passo:

sudo add-apt-repository ppa:ultradvorka/ppa
sudo apt-get update
sudo apt-get install hh

Installa hhsu Fedora, RHEL o CentOS:

sudo dnf|yum install hstr -y

Su macOS con homebrew:

brew install hh

... quindi configuralo con:

hh --show-configuration >> ~/.bashrc

Ciò sostituirà il comportamento predefinito Ctrl-R.

Esegui hh --show-configurationper determinare cosa verrà aggiunto al tuo profilo Bash.

Altre opzioni di configurazione disponibili sulla homepage del progetto su Github: https://github.com/dvorka/hstr

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.