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


14

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

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


Eu tentei o método usado bind '"\e[24~":"airmon-ng start wlan0\n"', mas depois que eu fechei o terminal, a coisa parece ser redefinida e todas as teclas de atalho são ido

Respostas:


20

Você pode usar o comando interno bindpara mapear um atalho de teclado para que ele execute um script de comando / shell.

Exemplo

Digamos que queremos executar o comando pwd, quando pressionamos a F12tecla.

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

Agora, quando eu pressionar F12o meu alerta, $:

$ pwd
/home/saml

Determinando atalhos de teclado

Você pode usar a seguinte técnica para determinar o código de escape para um determinado atalho de teclado. Na maioria dos sistemas, pressione Ctrl+ V, solte e, em seguida, pressione a tecla para a qual deseja o código. Existem alguns outros sistemas com os quais ele trabalhará, em Mvez deV

Exemplo

Pressionar Ctrl+ Ve soltar ambos Ctrle, Vfinalmente, pressionar F12em uma janela do terminal, retorna isso:

$ ^[[24~

Esta saída pode ser interpretada da seguinte forma, ^[é a Escchave. Portanto, quando queremos especificar essa chave específica usando o bindcomando, precisamos usar a \epara indicar a Escchave seguida por tudo o mais acima. Portanto, o bindcomando fica assim:

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

Executando um comando no meio

Também é possível bind -xconfigurar atalhos de teclado que executam comandos enquanto você digita algo no prompt, e a saída desses comandos é exibida, mas o que você digitou no prompt permanecerá intacto.

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

NOTA: Este método funciona apenas com atalhos de teclado que geram 1 caractere, portanto F12, não funcionará aqui.

Exemplo

Vamos usar o atalho de teclado Alt+ Shift+ W.

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

Digamos que estou digitando o comando finger:

$ finger

Agora clico no atalho do teclado Alt+ Shift+ 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 bindé executar o comando definido who, pegando sua saída e inserindo-a na frente do prompt. Se você repetir, verá o que está acontecendo, eis uma saída minha 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 idéia seria usar o bind -xmétodo acima e catexibir esse arquivo de texto quando solicitado:

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

Agora, quando executo comandos, posso ver este arquivo da seguinte maneira:

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

A saída do arquivo someinfo.txtestá sendo exibida acima do meu fingercomando acima.

Referências


Eu preciso apenas exibir o conteúdo, não executá-lo.
user3539

Então, ligue-se a um script que exibe o conteúdo.
Lars Rohrbach

1
Ctrl + m não está funcionando para mim. Ele age como se eu tivesse pressionado enter. Uma alternativa que eu acho (sou um novato no bash) é digitar echo ' (espaço após as aspas simples), pressione Ctrl + v, a tecla desejada e, em seguida, espaço, aspas simples ... conforme descrito aqui . Exemplo:echo ' ^[OD '
aliteralmind 12/01
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.