shell español - En bash, ¿cómo puedo vincular una tecla de función a un comando?




scripts manejo (4)

Puede determinar la secuencia de caracteres emitida por una tecla presionando Ctrl - v en la línea de comando, luego presionando la tecla que le interesa. En mi sistema para F12 , obtengo ^[[24~ . El ^[ representa Esc . Los diferentes tipos de terminales o emuladores de terminal pueden emitir códigos diferentes para la misma clave.

En un aviso de Bash puede ingresar un comando como este para habilitar la macro de la clave para que pueda probarla.

bind '"\e[24~":"foobar"'

Ahora, cuando presione F12 , obtendrá "foobar" en la línea de comandos listo para una posterior edición. Si desea una pulsación de tecla para ingresar un comando inmediatamente, puede agregar una nueva línea:

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

Ahora cuando presione F12 , obtendrá el directorio actual sin tener que presionar Enter . ¿Qué sucede si ya ha escrito algo en la línea y lo usa de manera automática? Podría ser complicado. Sin embargo, puedes borrar la línea como parte de tu macro:

bind '"\e[24~":"\C-k \C-upwd\n"'

El espacio se asegura de que la Ctrl - u tenga algo que eliminar para evitar que suene la campana.

Una vez que haya conseguido que la macro funcione de la manera que desee, puede hacerlo persistente al agregarla a su archivo ~/.inputrc . No es necesario el comando bind o el conjunto externo de comillas simples:

"\e[24~":"\C-k \C-upwd\n"

Editar:

También puede crear un enlace de clave que ejecutará algo sin alterar la línea de comando actual.

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

Luego, mientras está escribiendo un comando que requiere un nombre de usuario, por ejemplo, y necesita saber los nombres del usuario que está conectado, puede presionar Alt - Shift - W y la salida de who se mostrará y la solicitud vuelva a emitirse con su comando parcial intacto y el cursor en la misma posición en la línea.

Desafortunadamente, esto no funciona correctamente para teclas como F12 que generan más de dos caracteres. En algunos casos esto se puede solucionar.

El comando ( who en este caso) podría ser cualquier ejecutable: un programa, script o función.

Ejemplo: Quiero vincular la tecla F12 con el comando echo "foobar" manera que cada vez que presiono F12, el mensaje "foobar" se imprima en la pantalla. Idealmente, podría ser cualquier comando de shell arbitrario, no solo builtins. ¿Cómo se puede hacer esto?


Puede definir enlaces de tecla bash en .inputrc (archivo de configuración para la biblioteca GNU Readline). La sintaxis es

<keysym o nombre de la clave>: macro

por ejemplo:

Control-o: "> output"

creará una macro que inserta "> salida" cuando presiona

 "\e[11~": "echo foobar"

creará una macro que inserta "echo foobar" cuando presionas F1 ... No sé qué teclados para F11 está disponible.


Esta solución es específica para entornos X11 y no tiene nada que ver con bash, sino que agrega lo siguiente a su .Xmodmaps

 % loadkeys
 keycode 88 = F12
 string F12 = "foobar"
 %

enviará la cadena "foobar" a la terminal al presionar F12.


Hay una manera simple e inteligente como esta:

echo "add:sfff" | xargs -d: -i  echo {}

Pero debe usar gnu xargs, BSD xargs cant support -d delim. Si usas Apple Mac como yo. Puedes instalar gnu xargs:

brew install findutils

entonces

echo "add:sfff" | gxargs -d: -i  echo {}






bash shell binding