Eliminar ^ C cuando CTRL + C

25

¿Hay alguna forma de eliminar ^Ccuando presionas CTRL+ Cen el shell incluido con Red Hat Enterprise Linux 6 ("Santiago")? Tengo permiso para editar el mío .bash_profile.

Fede Gold
fuente
44
probarset echo-control-characters off
Sundeep
1
Lo intenté pero no funcionó
Fede Gold

Respuestas:

29

Edite (o cree) su ~/.inputrcarchivo. Agregue una línea que diga

set echo-control-characters Off

Esto le indicará a la biblioteca GNU Readline (que usa Bash) que no muestre (haga eco) ningún carácter de control en la pantalla. La configuración estará activa en todas las nuevas sesiones de Bash a partir de entonces (y en cualquier otra utilidad que use la biblioteca Readline).

Tenga en cuenta que si su sistema Unix viene con un archivo de configuración de todo el sistema para la biblioteca Readline (generalmente /etc/inputrc), entonces su archivo de configuración personal deberá incluir ese archivo:

$include /etc/inputrc
set echo-control-characters Off

Otra alternativa es hacer una copia personal del archivo de configuración de todo el sistema y luego modificarlo.

Kusalananda
fuente
Hola, probé esto y está funcionando bien, pero cuando interrumpí un comando bash en ejecución no funcionó, por ejemplo, sleep 180y
presioné
@ Ten-Coin Solo funcionará si el comando usa la biblioteca Readline desafortunadamente.
Kusalananda
1
Si ~/.inputrcaún no existe, simplemente crear el archivo puede perder algunas configuraciones existentes. En mi caso, primero noté que ctrl + left y ctrl + right habían dejado de funcionar. La solución fue comenzar ~/.inputrccon esta línea $include /etc/inputrc. También es posible simplemente cp /etc/inputrc .inputrceditar y editar como se desee.
kasperd
2
@kasperd Buen punto! No sabía que agregar un archivo de configuración personal deshabilitaría la lectura del archivo de configuración de todo el sistema (mi sistema no tiene uno). Actualizaré mi respuesta.
Kusalananda
20

Intenta lo siguiente:

stty -echoctl

Para obtener una explicación, vea esta publicación excelente y detallada de Stéphane Chazelas que también explica algunas otras sttycaracterísticas .

Si desea que ese cambio sea permanente (y lo está utilizando bashcomo está implícito en su pregunta), entonces es mejor incluirlo en jlmg.bashrc como se indica en los comentarios (por lo que se aplica a todos los shells interactivos).

phk
fuente
+1 En contraste con la solución readline, esto debería funcionar para la mayoría, si no todas, las cosas que se ejecutan en el terminal.
JoL
1
Probablemente debería mencionarse que no funcionará en todos los terminales si se coloca .bash_profilecomo ese archivo solo se analiza mediante shells de inicio de sesión. Debería colocarse en su .bashrclugar, por lo que es leído por todas las invocaciones interactivas.
JoL
1
¿Esto todavía no se hará eco del byte 0x03 sin procesar, que teóricamente puede ser interpretado por algunos terminales? También tendrá efectos secundarios si se hacen las cosas como correr un comando no readline, al pulsar una tecla de dirección se moverá el cursor en la pantalla en lugar de mostrar^[[A
Random832
1
@ Random832 +1 Tienes razón. Supongo que esa configuración está mal nombrada; no controla el eco de los caracteres de control, sino su traducción a caracteres imprimibles antes de hacer eco. Para evitar ese efecto secundario, también deberías stty -echohacerlo. Eso, por supuesto, evitará que se haga eco de todo lo demás, lo que probablemente haga que esta respuesta sea imposible si todo lo que quería era ocultar el ^Cs.
JoL
1
@jlmg Si ^Csiempre fue al final, podría estar de acuerdo contigo. Pero ^Cse imprimirá donde esté el cursor, lo que puede sobrescribir un par de caracteres en cualquier parte del comando. Eso significa que si necesita copiar y pegar partes de ese comando, puede terminar con algo destrozado. Y ^Cno se reconoce tan fácilmente cuando se mira por el terminal como lo habría sido si estuviera al final del comando.
kasperd
2

Si está tratando de encontrar una configuración que permita el eco normal (incluido echoctl) y simplemente silencie el eco de los caracteres generadores de señal, y está seguro de que debería ser posible porque lo ha visto funcionar así antes ...

Probablemente lo hayas visto de esa manera. Pero ya no es posible, debido a este compromiso :

cometer ec5b1157f8e819c72fc93aa6d2d5117c08cdc961

Active INTR / QUIT / SUSP haciendo eco en la disciplina de línea N_TTY (por ejemplo, ctrl-C aparecerá como "^ C" si stty echoctl está configurado y ctrl-C está configurado como INTR).

Linux parece ser el único sistema operativo similar a Unix (recientemente he verificado esto en Solaris, BSD y Mac OS X) que no se comporta de esta manera, y realmente extraño esto como una buena confirmación visual de la interrupción de un programa en la consola o xterm. Recuerdo esto con cariño de muchos Unix que he usado a lo largo de los años también. Llevar esto a Linux también parece una buena manera de hacerlo aún más compatible con el comportamiento estándar de Unix.

Si recuerda con cariño cómo Linux solía no hacer eco de eso ^C, la única forma de recuperar el comportamiento anterior es parcheando su núcleo. En versiones recientes, el eco de los caracteres generadores de señal se encuentra en las líneas 1215-1218 de drivers / tty / n_tty.c .


fuente