Pesquisa interativa estilo Ctrl-R no arquivo personalizado

4

Eu quero poder pesquisar um arquivo de texto personalizado semelhante à pesquisa de histórico interativo no bash.

Quando a entrada desejada for encontrada, executa a linha.

Pontos de bônus: cada registro contém dois campos - o alvo da busca, e o comando que será executado

O que estou tentando fazer com isso é permitir a conclusão automática rápida de nomes de servidores a partir de uma lista de servidores.

    
por Ophir Yoktan 26.07.2014 / 23:16

1 resposta

4

Você pode carregar um arquivo personalizado no próprio histórico do Bash usando o comando history . history -r lerá o arquivo que você nomeou como seu histórico de comandos, ou o arquivo chamado em HISTFILE se você não nomear um:

history -r ~/custom

Depois disso, você pode usar qualquer uma das ações comuns que acessam o histórico com os dados do seu arquivo personalizado, incluindo Ctrl-R , ! expansão do histórico e assim por diante.

Se você quiser que isso seja ativado temporariamente, salve seu histórico atual, leia o arquivo personalizado e, em seguida, leia o arquivo comum no final:

$ history -w # Or -a if you prefer
$ history -r ~/custom
...
$ history -cr

history -cr limpará o histórico na memória e o lerá no arquivo de histórico padrão $HISTFILE . Você também pode criar aliases para encurtar esse processo.

Como alternativa, você pode adicionar valores calculados ao histórico usando history -s . O seguinte equivale a apenas ler o arquivo:

while read command
do
    history -s "$command"
done < ~/custom

Você pode adicionar quantas entradas de histórico arbitrário desejar dessa maneira, calculadas a partir de quaisquer dados disponíveis (por exemplo, ler uma lista de portas e nomes de servidores e usar history -s "ssh -p $port $servername" ). Isso funciona bem em uma função. As mesmas opções para gravar, limpar e restaurar o histórico se aplicam aqui também.

Como opção final, se você definir HISTFILE no ambiente ao iniciar bash , ele honrará esse arquivo como seu histórico. Você pode iniciar um novo shell a partir de um script com HISTFILE definido adequadamente para permitir que o usuário escolha um comando: HISTFILE=~/custom bash . Com uma construção cuidadosa, você pode fazer com que o shell termine imediatamente após executar o comando selecionado.

Ao sair do próprio Bash, rlwrap é uma ferramenta para finalizar qualquer outra ferramenta de linha de comando no Readline . rlwrap -H ~/custom cmd... executará um comando com o arquivo fornecido do histórico. Você pode construir esse programa para fazer exatamente o que você quer, incluindo selecionar apenas o nome do servidor com a entrada do usuário e construir o comando depois.

    
por 27.07.2014 / 01:31