Existe alguma maneira de executar comandos do histórico?

99

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

Só estou me perguntando 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.

Único
fonte
14
você conhece ctrl-r?
Carlos Campderrós
1
Sim, eu sei disso, mas não é exatamente o que eu quero.
The One

Respostas:

171

No bash, tudo !636ficará bem.

user164825
fonte
12
In Linux- Isso tem mais a ver com o shell (bash, zsh, etc) em que uma pessoa está executando e o sistema operacional em que está executando. Existem shell no linux sem suporte para a história.
precisa
@ Zoredache E da mesma forma, isso funciona bem na maioria das implementações do bash no Windows.
precisa saber é o seguinte
1
Não apenas bash, é claro, mas outras conchas também - incluindo o csh.
Tirou
5
Se você possui um comando muito semelhante ao que deseja executar, pode anexar :ppara imprimir o comando sem executá-lo, !636:ppor exemplo. O que significa que você pode facilmente selecioná-lo novamente a partir de seu histórico, pressionando a seta para cima e fazer as pequenas mudanças que você quer
AJefferiss
78

Sim, isso se chama "expansão da história". Vejo

LESS='+/^HISTORY EXPANSION' man bash

para mais detalhes.

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 o número do histórico:

!!

Ou você pode executar dois comandos de volta:

!-2

A forma que eu 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 o preenchimento da guia, posso fazer o seguinte:

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

Novamente, leia a página do manual para mais detalhes:

LESS='+/^HISTORY EXPANSION' man bash
Curinga
fonte
25
Interativamente, Alt-.pode ser mais conveniente do que !$. Ele insere o último argumento do último comando literalmente na linha.
ulidtko
2
@ulidtko Onde estão documentadas essas escapadas especiais (eu sabia !$, mas nunca ouvi falar Alt-.)? Você vai postar um link para ele, por favor?
Edmz 08/04
5
LESS="+/DEFAULT KEY BINDINGS" man 3 readline, /etc/inputrc, ~/.inputrc. Muitos programas além do bash usam libreadline; para quem obtém, você obtém os mesmos recursos Alt-., como Ctrl-X-U(desfazer), Ctrl-/(descrever atalho), preenchimento de guias etc. - de graça. Por exemplo, com apenas três linhas de PYTHONSTARTUPuma, é possível ativar o preenchimento de guias e o histórico no REPL do python padrão . O que funcionará (principalmente) da mesma forma que no bash, já que é a biblioteca GNU Readline que faz o trabalho. A página de manual da linha de leitura descreve os recursos em detalhes.
ulidtko
2
Além disso, o Ctl-UpArrow (ou AltUpArrow no bash) rolará para trás na lista de histórico. Digitando alguns caracteres, o UpArrow obtém apenas os comandos que começam com essa letra, por exemplo, "fr (Ctl-Up)" percorre todos os comandos "free ..." na lista do OP. Isso também funciona em coisas como gnuplot e gdb que usam readline.
jamesqf
2
@ Ajedi32, veja a linha em negrito final na minha resposta. :) Na verdade, essa resposta é apenas uma amostra do que a expansão da história pode fazer . Lembre-se de que isso está no nível do shell, não no comando que você está chamando; portanto, echo {1..5}seguido por touch !$tocará cinco arquivos, não apenas um. Então, estritamente falando, não é o último argumento, mas a última palavra concha nessa linha. (Tente também echo hello >tempseguir echo goodbye !$.) Se você puder pensar em uma maneira de colocá-lo mais claramente, fique à vontade para sugerir uma edição.
Curinga
14

Uma boa, se você não quiser primeiro histórico, anote o número, etc:

no bash (e talvez outros):

ctrl-r something 

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

Isso mostrará a última linha do histórico que contém something. Para obter o anterior, pressione ctrl-r (sozinho) novamente, sempre que obtiver uma linha anterior.

ex:

ctrl-r  10

para mostrar a última linha do histórico contendo '10' (por exemplo, a linha com $10, no seu exemplo) e ctrl-rnovamente até recuperar a linha do histórico que estava procurando

Quando a linha que queria aparecer, apenas Enterpara executá-lo (ou você também pode editá-lo, usando o arrow keys, backspacee ctrl-apara ir para o início da linha, ctrl-epara chegar ao fim, ctrl-k: "matar" do cursor para o fim da linha (= exclui + salva em um buffer),: ctrl-ypara restaurar, a partir do buffer, um bit eliminado anteriormente, etc.)

Se você deseja pesquisar para a frente (ctrl-s), primeiro precisa desativar o XON : consulte https://stackoverflow.com/a/791800/1841533 :

"apenas para desativar o XON / XOFF executando

stty -ixon

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

Olivier Dulac
fonte
Se eu fizer isso e acidentalmente pressionar ctrl-r uma vez ou mais, há alguma maneira de pesquisar novamente no histórico?
kasperd
@ Kasperd: Sim, você pode. muitas respostas no se destacam: ctrl-s para pesquisa direta.
Olivier Dulac
Infelizmente, o ctrl-s é usado para congelar o terminal, e o bash não o desativa, portanto não funciona na configuração padrão. (Outros programas - como emacs - desactiva a associação de teclas para congelar o terminal de tal modo que ctrl-s pode ser usada para pesquisa.)
kasperd
@kasperd: Sim, desculpe por não ter mencionado isso anteriormente (apontei "muitas respostas" porque elas são precisas), mas não tomei tempo para digitar isso no comentário ou fornecer um link ... (Eu estava usando o meu .. telefone) Eu agora voltou para casa e poderia editar que na resposta acima ctrl-s para a festança histórico precisa de você para stty -ixon primeiro
Olivier Dulac
Esse comando interromperá o uso normal de ctrl-s, então isso não é realmente uma opção.
kasperd
7

Você pode usar o shell builtin fc :

fc -s 636
Steven Penny
fonte
2
Na verdade, isso é melhor do que a resposta aceita, mas você deve removê -s-lo para obter os benefícios. Se você executar, fc 636você abrirá um editor com o comando 636 do seu histórico no buffer e, quando salvar e sair, o comando (modificado ou não) será executado. E melhor ainda, este é compatível com POSIX .
Curinga
@StevenPenny Thanks. E sim, eu sei o que é o POSIX, embora não veja a relevância. Independentemente disso, alguma documentação de fácil acesso e incluída seria legal.
FaHemem Mitha 11/11
@FaheemMitha tente executar "help fc".
Curinga
@Wildcard helpnão é POSIX - pode ter que fazer man dashou algo parecido #
Steven Penny
@Wildcard Obrigado. Eu costumo esquecer que helpexiste. Outro shell embutido. E intrigante para usuários incautos que podem querer ajuda com um novo sistema, mas são confrontados com um fluxo de bobagens. :-(
Faheem Mitha 11/11
3

Existe HSTR- hhcomando para bashe zshseleção de comando interativa, melhor que a pesquisa reversa Ctrl-R:

hh exemplo de comando de história interativa

é interativo, para que você possa procurar e editar o comando antes de executá-lo.

No Ubuntu, você pode instalar hhcom o seguinte recurso:

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

ou passo a passo:

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

Instale hhno Fedora, RHEL ou CentOS:

sudo dnf|yum install hstr -y

No macOS com homebrew:

brew install hh

... em seguida, configure-o com:

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

Isso substituirá o comportamento padrão do Ctrl-R.

Execute hh --show-configurationpara determinar o que será acrescentado ao seu perfil do Bash.

Mais opções de configuração disponíveis na página inicial do projeto no Github: https://github.com/dvorka/hstr

modlin
fonte