bash readline: Ligação de chaves que executa um comando externo

4

(Background: Eu sou um usuário tcsh de longa data, gradualmente fazendo a transição para o bash e tentando encontrar equivalentes para alguns recursos específicos do tcsh.)

No tcsh, posso definir uma ligação de chave que executa um comando externo. Por exemplo, dado:

bindkey -c ^Gu uptime

Eu posso digitar "Control-G u" no tcsh e ele executará o comando uptime . Eu não tenho que digitar Enter, o comando não aparece no meu histórico, e posso fazê-lo no meio de uma linha de entrada (acho o último particularmente útil para certos comandos).

O bash tem um mecanismo de ligação de chaves similar através da biblioteca readline do GNU, com ligações especificadas em $HOME/.inputrc (ou em outro lugar). Mas depois de ler a documentação de info readline , não vejo uma maneira de uma ligação de chave executar um comando externo.

A coisa mais próxima que eu descobri é adicionar algo assim ao meu arquivo .inputrc :

"\C-gu": "uptime\n"

mas isso não executa o comando; em vez disso, ele age como se eu tivesse digitado uptime seguido da tecla Enter. O comando aparece no meu histórico (ok) e funciona apenas em uma linha vazia; se eu digitar "echo control-Gu" , então ele imprime uptime em vez de executar o comando.

Outra desvantagem é que a ligação afeta outros comandos que usam a linha de leitura GNU, como o depurador Perl.

Existe uma maneira de simular o efeito de bindkey -c do tcsh no bash, mapeando uma sequência de chaves para a execução de um comando externo especificado?

Se for importante, estou usando o bash 4.2.24 no Ubuntu 12.04 beta 2.

    
por Keith Thompson 20.04.2012 / 00:00

1 resposta

6

Nem todas as edições da linha bash são controladas a partir de ~/.inputrc ; grande parte é configurada através do bind builtin. Neste caso, você quer algo como

bind -x '"\C-gu":uptime'

no seu ~/.bashrc .

    
por 20.04.2012 / 00:11