it-swarm-es.tech

¿Cómo descongelar después de presionar accidentalmente Ctrl-S en un terminal?

Es una situación que me ha sucedido con bastante frecuencia: después de presionar (con una intención diferente) Ctrl-S en un terminal, la interacción (entrada o salida) con él está congelada. Probablemente sea una especie de "bloqueo de desplazamiento" o lo que sea.

¿Cómo descongelo el terminal después de esto?

(Esta vez, he estado trabajando con apt-Shell dentro de un bash dentro urxvt-- no estoy seguro de cuál de ellos es responsable del manejo especial de Ctrl-S: Estaba buscando el historial de comandos al revés con C-r, como de costumbre para readline, pero luego quería "retroceder" hacia adelante a través de la historia con lo habitual, al menos en Emacs,C-s ( 1 , 2 , ), pero eso provocó que el terminal se congelara. Bueno, el desplazamiento/paginación para ver cosas pasadas todavía funciona en la terminal, pero no hay interacción con los procesos que se ejecutan allí).

772

Ctrl-Q

Para deshabilitar esto por completo, pegue stty -ixon en un script de inicio. Para permitir que cualquier tecla haga que las cosas vuelvan a fluir, use stty ixany.

ps: No es ni la terminal ni el Shell lo que hace esto, sino el controlador de terminal del sistema operativo.

924
ak2

Ctrl-Q Es de hecho la respuesta. Pensé en incluir un poco de historia de esto que es demasiado larga para caber en los márgenes de respuesta correcta de ak2 .

En la Edad Media, un terminal era un gran equipo que se conectaba a un dispositivo remoto (originalmente otro terminal porque los teletipos eran mucho más fáciles de aprender a operar que una tecla telegráfica) a través de un cable largo o mediante líneas telefónicas con módems. En el momento en que Unix se estaba desarrollando, el código ASCII ya estaba bien establecido (aunque el código EBCDIC de la competencia de IBM todavía era una fuerza a tener en cuenta).

Los primeros terminales mantuvieron un registro impreso de cada personaje recibido. Mientras los caracteres lleguen no más rápido de lo que el cabezal de impresión podría escribirlos, al menos. Pero tan pronto como los terminales basados ​​en CRT fueron posibles, surgió el problema de que solo unas 25 líneas cabían en el CRT, y 25 líneas de 80 caracteres representaban suficientes RAM que nadie pensó seriamente en proporcionar más = RAM para los caracteres que se desplazaron desde la parte superior de la pantalla.

Por lo tanto, se necesitaba alguna convención para indicar que el final del envío debería detenerse para permitir que el lector se pusiera al día.

El código de 7 bits ASCII tiene 33 puntos de código dedicados a caracteres de control (0 a 31 y 127). Algunos de ellos tenían propósitos realmente bien establecidos, como NUL (en blanco guía de cinta de papel para enhebrar, espacios y empalmes), DEL (los caracteres "tachados" en la cinta de papel se indican perforando los siete agujeros), BEL (Ding!), CR, LF y TAB. Pero cuatro se definieron explícitamente para controlar el dispositivo terminal en sí (DC1 a DC4 aka Ctrl + Q, Ctrl + R, Ctrl + S y Ctrl + T).

Mi mejor conjetura es que algún ingeniero pensó que (a medida que avanza la mnemotecnia), "S" para "Parar" y "Q" para "Continuar" no estaban tan mal, y asignó DC3 significa "por favor deja de enviar" y DC1 significa "ok, continúa enviando ahora".

Incluso esa convención ya estaba bien establecida cuando Unix estaba dejando el nido en los Laboratorios Bell para salir al mundo.

La convención se conoce como control de flujo de software y es extremadamente común en dispositivos seriales reales. No es fácil de implementar correctamente, ya que evita el uso de cualquiera de esos caracteres para cualquier otro propósito en el canal de comunicaciones, y la señal de Stop debe manejarse antes que los caracteres recibidos pendientes para evitar enviar más de lo que el extremo receptor puede encargarse de.

Si es práctico, se prefiere ampliamente el uso de señales adicionales fuera de banda del flujo de datos en serie para el control de flujo. En las conexiones cableadas directamente que pueden permitirse los cables de señal adicionales, encontrará un apretón de manos de hardware en uso, que libera esos caracteres para otros usos.

Por supuesto, la ventana de terminal de hoy no está usando un puerto serie físico real, tiene barras de desplazamiento y realmente no necesita el protocolo de comunicación. Pero la convención persiste.

Recuerdo la afirmación de que Richard Stallman recibió quejas sobre su asignación Ctrl + S a la búsqueda incremental en las primeras versiones de emacs, y que no simpatizaba con ningún usuario que tuviera que depender de una conexión controlada por flujo de software de 7 bits.

412
RBerteig