Como executar um script no shell quando uma tecla de atalho é pressionada

13

Como eu poderia executar um script no Shell quando uma tecla de atalho é pressionada.

Essencialmente, o que preciso é quando uma tecla de atalho é pressionada, o script deve ler de um arquivo e exibir esse conteúdo no terminal.

    
por user3539 06.09.2013 / 05:32

1 resposta

20

Você pode usar o comando incorporado, bind para mapear um atalho de teclado para que ele execute um script de comando / shell.

Exemplo

Digamos que queremos executar o comando pwd quando pressionarmos a tecla F12 .

$ bind '"\e[24~":"pwd\n"'

Agora, quando eu pressionar F12 no meu prompt, $ :

$ pwd
/home/saml

Como determinar os atalhos de teclado

Você pode usar a técnica a seguir para determinar o código de escape de um determinado atalho de teclado. Na maioria dos sistemas, pressione Ctrl + V , solte e pressione a tecla para a qual deseja o código. Existem alguns outros sistemas que trabalharão com M em vez de V

Exemplo

Pressionando Ctrl + V , libere as teclas Ctrl e V e finalmente pressione F12 em uma janela de terminal retorna isto:

$ ^[[24~

Esta saída pode ser interpretada da seguinte forma, ^[ é a tecla Esc . Então, quando queremos especificar essa chave específica usando o comando bind , precisamos usar um \e para denotar a tecla Esc seguida de todo o restante acima. Então, o comando bind tem esta aparência:

$ bind '"\e[24~":"....."'

Executando um comando no meio

Você também pode usar o bind -x para configurar atalhos de teclado que executarão comandos enquanto você estiver digitando algo no prompt, e a saída desses comandos será exibida, mas o que você estiver digitando em o prompt permanecerá intacto.

$ bind -x '"\eW":"..."'

NOTA: Este método só funciona com atalhos de teclado que produzem 1 caractere, então F12 não funcionará aqui.

Exemplo

Vamos codificar o atalho de teclado Alt + Deslocar + W .

$ bind -x '"\eW":"who"'

Digamos que eu esteja digitando o comando finger :

$ finger

Agora eu toquei no atalho de teclado Alt + Deslocamento + W :

saml     tty1         2013-09-01 11:01 (:0)
saml     pts/0        2013-09-01 11:03 (:0.0)
saml     pts/1        2013-09-01 11:05 (:0.0)
saml     pts/2        2013-09-01 11:05 (:0.0)
saml     pts/5        2013-09-03 22:45 (:0.0)
$ finger

O que está acontecendo é que bind está executando o comando definido, who , obtendo sua saída e inserindo-a na frente do prompt. Se você repetir, verá o que está acontecendo, aqui está a saída de mim, batendo duas vezes:

saml     tty1         2013-09-01 11:01 (:0)
saml     pts/0        2013-09-01 11:03 (:0.0)
saml     pts/1        2013-09-01 11:05 (:0.0)
saml     pts/2        2013-09-01 11:05 (:0.0)
saml     pts/5        2013-09-03 22:45 (:0.0)
saml     tty1         2013-09-01 11:01 (:0)
saml     pts/0        2013-09-01 11:03 (:0.0)
saml     pts/1        2013-09-01 11:05 (:0.0)
saml     pts/2        2013-09-01 11:05 (:0.0)
saml     pts/5        2013-09-03 22:45 (:0.0)
$ finger

Seu problema

Portanto, uma ideia seria usar o método bind -x acima e cat para exibir esse arquivo de texto no seu prompt:

$ bind -x '"\eW":"cat someinfo.txt"'

Agora, quando executo comandos, posso ver esse arquivo da seguinte forma:

This is text from some 
multi-line file reminding
me how to do some 
stuff
$ finger 

A saída do arquivo someinfo.txt está sendo exibida acima do comando finger acima.

Referências

por 06.09.2013 / 06:28