Existe alguma maneira de executar comandos do histórico?

77

Por exemplo:

[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"}'

Eu só estou querendo saber se existe alguma maneira de executar o comando 636 sem digitá-lo novamente, basta digitar algo mais o número, como o histórico 636 ou algo assim.

    
por The One 08.04.2016 / 04:44

5 respostas

130

No bash, apenas !636 será ok.

    
por 08.04.2016 / 05:31
69

Sim, é chamado de "expansão de histórico". Veja

LESS='+/^HISTORY EXPANSION' man bash

para detalhes completos.

Usar um ponto de exclamação seguido por um número é sem dúvida o uso mais simples:

!636

No entanto, você também pode executar o último comando executado diretamente sem saber seu número de histórico:

!!

Ou você pode executar dois comandos de volta:

!-2

O formulário que mais uso, no entanto, é repetir o último argumento do último comando:

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

Ou digamos que estou inspecionando um arquivo. Usando a conclusão da tabulação, posso fazer o seguinte:

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

Novamente, leia a man page para mais detalhes:

LESS='+/^HISTORY EXPANSION' man bash
    
por 08.04.2016 / 06:03
13

Um bom, se você não quer primeiro histórico, anote o número, etc:

no bash (e talvez outros):

ctrl-r something 

( ctrl-r ="pesquisa inversa interativa") ( something = parte de um comando anterior)

Isso mostrará a última linha do histórico que contém something . Para obter o anterior, faça ctrl-r (sozinho) novamente, cada vez que ele recebe uma linha anterior.

ex:

ctrl-r  10

para mostrar a última linha do histórico que contém '10' (por exemplo, a linha com $10 , no seu exemplo) e ctrl-r novamente até você recuperar a linha do histórico que estava procurando

Quando a linha que você deseja aparecer, apenas Enter para executá-la (ou você também pode editá-la, usando arrow keys , backspace e ctrl-a para ir para o início da linha, ctrl-e para chegar ao fim, ctrl-k : para "matar" do cursor para o final da linha (= exclui + salva em um buffer), ctrl-y : para restaurar, do buffer, um bit anteriormente morto, etc. )

Se você quiser pesquisar para a frente (ctrl-s), primeiro precisa desativar o XON : consulte link :

"apenas para desativar o XON / XOFF executando

stty -ixon

" (e então você poderá usar ctrl-s, sem congelar o terminal)

    
por 08.04.2016 / 23:11
5

Você pode usar o shell embutido fc :

fc -s 636
    
por 10.04.2016 / 21:20
2

Existe o comando HSTR - hh para a seleção de comandos interativos bash e zsh , melhor que o Ctrl -R pesquisa inversa:

éinterativo,paraquevocêpossaprocurareeditarocomandoantesdeexecutá-lo.

NoUbuntu,vocêpodeinstalarhhcomoseguinteone-liner:

sudoadd-apt-repositoryppa:ultradvorka/ppa&&sudoapt-getupdate&&sudoapt-getinstallhh&&hh--show-configuration>>~/.bashrc

oupassoapasso:

sudoadd-apt-repositoryppa:ultradvorka/ppasudoapt-getupdatesudoapt-getinstallhh

InstalehhnoFedora,RHELouCentOS:

sudodnf|yuminstallhstr-y

NomacOScomhomebrew:

brewinstallhh

...entãoconfigure-ocom:

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

IssosubstituiráocomportamentopadrãoCtrl-R.

Executehh--show-configurationparadeterminaroqueseráanexadoaoseuperfilBash.

MaisopçõesdeconfiguraçãodisponíveisnapáginainicialdoprojetonoGithub: link

    
por 26.02.2018 / 00:56