Executar o comando do histórico com parâmetros

0

Sempre que eu precisar digitar um longo comando, acho que o ponto de exclamação para se referir ao histórico é muito útil. Por exemplo, !ssh pode ser usado para invocar o último comando ssh que usei. No entanto, não consigo fazê-lo funcionar quando argumentos delimitados por espaço são adicionados à pesquisa.

Ao executar !ssh -i , espero que o último comando que começa com a string "ssh -i" seja executado. No entanto, o comando real invocado é o último comando ssh com qualquer argumento e, em seguida, "-i" foi anexado ao comando.

Eu posso usar !?ssh -i? , mas isso é feito para fazer algo diferente e acredito que deve haver uma maneira simples de conseguir isso. Também estou relutante em digitar history|grep ... todas as vezes.

Então, como posso me referir a um comando no histórico que começa com uma string contendo espaço, como dito acima?

Editar Parece que não expliquei a questão de forma clara o suficiente. Digamos que eu tenha o seguinte histórico

ssh -i identity host1
echo ssh -i
ssh host2

agora, se eu executar !ssh , o terceiro comando, ou seja, ssh host2 será executado. Espero digitar !ssh -i para obter o primeiro comando executado, mas ssh host2 -i é executado (o que resulta em um erro). Eu posso usar !?ssh -i? para executar o primeiro comando somente se o segundo comando não existir .

    
por Weijun Zhou 05.01.2018 / 17:03

2 respostas

0

Graças ao comentário de Mark Plotnick. Eu encontrei uma solução. Embora não esteja usando expansão de histórico bash. (Acredito que usar a expansão do histórico bash para conseguir isso é impossível depois de ler [seção 9.3.1 do manual de referência do bash]. ( link )

A solução é colocar as seguintes linhas em ~/.inputrc ou descomentar as linhas correspondentes em /etc/inputrc para efeito global.

"\e[5~": history-search-backward
"\e[6~": history-search-forward

O código correspondente pode ser encontrado pressionando Ctrl V e depois a tecla PageUp , e os comandos são obtidos de section 8.4.2 do manual bash .

Depois disso eu posso usar a tecla PageUp para ir ao primeiro comando como Mark comentou.

    
por 08.01.2018 / 11:51
1

Eu acredito que você queira mudar o comportamento padrão do HISTCONTROL do bash. Deste post: Por que o bash não armazena comandos que começam com espaços

HISTCONTROL

A colon-separated list of values controlling how commands are saved on the history list. If the list of values includes ignorespace, lines which begin with a space character are not saved in the history list. A value of ignoredups causes lines matching the previous history entry to not be saved. A value of ignoreboth is shorthand for ignorespace and ignoredups.

Se você quiser pular o! e permitir espaços, então eu sugiro que você tente um shell diferente de bash. O shell de peixe funciona perfeitamente para o que você está perguntando:)

sudo apt-get install fish

para experimentá-lo a partir do seu shell bash basta digitar 'fish'

Se você gosta, pode persistir com:

chsh -s /usr/bin/fish

    
por 05.01.2018 / 17:14