Juegos de caracteres alternativos en la emulación de terminal

Juegos de caracteres alternativos en la emulación de terminal

A veces accidentalmente obtengo catalgunos datos binarios; a veces algunos programas ncurses fallan; por muchas razones, la terminal puede terminar en mal estado y requerir manual reset. Esto sucede con demasiada frecuencia.

Un estado tan malo puede ser la falta de eco, la conversión de todo en basura china o muchas otras cosas.

¿Existe alguna manera sencilla de asegurarse de que la configuración del terminal (sin restablecimiento completo, limpieza de pantalla, etc.) se restablezca cuando Shell recupere el control?

Es bashy Terminal.apppero supongo que este problema es prácticamente universal.

Respuesta1

Los problemas que mencionas surgen en diferentes capas y sólo algunos de ellos pueden solucionarse con “códigos de escape”.

Juegos de caracteres alternativos en la emulación de terminal

Existe un problema común en el terminal que podría describirse como “(algunas) letras minúsculas se muestran como símbolos o caracteres de dibujo lineal” (consulteesta otra pregunta SO). Puede que esto no esté relacionado con su problema de “basura china”, pero es lo más parecido que he visto. También puede encontrarse con "basura china" al interpretar casi cualquier flujo de datos de 8 bits como texto codificado en UTF-16. Por lo general, este no es un problema "peligroso" que deba restablecerse, por lo que probablemente no sea el problema que está viendo.

El problema de "atascado con caracteres de dibujo lineal" generalmente proviene de enviar al emulador de terminal una secuencia de control no intencional (o detener un programa antes de que haya reiniciado el terminal después de cambiar al conjunto de caracteres alternativo). Esto puede suceder cuando se muestran algunos datos binarios y el flujo de bytes contiene una secuencia de control de terminal que selecciona un juego de caracteres alternativo.

Esto es fácil de activar en la mayoría de terminales estilo VT-100 ya que todo lo que se necesita es un solo byte (0x0e; consultemi respuesta a la pregunta SO previamente vinculada). La secuencia de control para restablecer esta condición también es de un solo byte (0x0f; a menudo se produce mediante echo ^V^O(escrito como echo Control+ V Control+ Oo directamente como printf '\017').

Puede solucionar este tipo de problema ** haciendo que el mensaje incluya un byte 0x0f.
** Si tu “basura china” se debe a algún otro problema entonces podría tener una solución diferente.

PS1="\[\017\]… "

El \[y \]están ahí para contarlo.intentoque el carácter delimitado no es imprimible. Esto permiteintentomantenga una idea precisa de la posición "física" del cursor (esto es importante para volver a mostrarlo correctamente cuando utilice la función de edición de línea de comando).


Como señala Ignacio Vázquez-Abrams ensu respuesta, otra forma de obtener la secuencia de control deseada es a través delponerdominio:

tput rmacs

Con este método, podrías evitar modificar PS1 y simplemente poner el comando anterior en PROMPT_COMMAND:

PROMPT_COMMAND='tput rmacs'

Opciones de TTY (termios)

El problema de “no eco” *** proviene de configuraciones inesperadas de las opciones del dispositivo tty basado en sistema operativo que conecta su emulador de terminal a todos los programas que se ejecutan dentro de la ventana del terminal. Esto suele deberse a programas de interfaz de usuario de texto interactivo que tienen errores, fallan o mueren de modo que no pueden restaurar el tty a su estado original.

Puede controlar estos ajustes con elpocilgadominio. Este tipo de problema no se puede resolver con “códigos de escape” ya que las opciones tty se configuran mediante API de software (vertcsetattr(3)ytérminos(4)). Generalmente stty sanees un buen mecanismo de reinicio.
*** También “no ^C/^Z/^/”, “salida escalonada” (sin CR automático cuando se recibe un LF) y varios otros problemas.

reiniciar

ElreiniciarEl comando generalmente puede ayudar con ambos tipos de problemas. Enviará secuencias de control de inicialización del terminal que normalmente solucionarán el problema del juego de caracteres alternativos y restablecerá las opciones tty a valores razonables.

El problema conreiniciares que también imprime mensajes adicionales en algunos sistemas (por ejemplo, “Borrar es…”, “Interrumpir es…”); probablemente no desee que se muestren antes de cada mensaje. Si su implementación dereiniciarenvía los mensajes y las secuencias de control a diferentes lugares (por ejemplo, uno va a stdout mientras que el otro va a stderr), entonces es posible que pueda filtrar los mensajes (por ejemplo, PROMPT_COMMAND='reset 2>/dev/null'(ver más abajo) y omitir poner ^O en el mensaje).

^O ystty sane

Enintento, puede configurar el parámetro PROMPT_COMMANDcomo comando yintentose ejecutará si antes de mostrar el mensaje principal. Podrías poner todas las llamadas stty saneallí y poner ^O en tu mensaje:

PROMPT_COMMAND='stty sane'
PS1="\[\017\]… "

Nuevamente, puede evitar modificar PS1 (y manejar terminales que no sean de estilo VT-100) usandoponer(como lo sugiere Ignacio Vázquez-Abrams):

PROMPT_COMMAND='stty sane; tput rmacs'

Respuesta2

Poner

echo -n "$(tput rmacs)"

en $PROMPT_COMMAND.

Respuesta3

Así que seré menos línea de comando, siempre tienes en xterm o en cualquier terminal un "botón" de reinicio o reinicio completo, para terminal.app está en el menú Shell. Enviar restablecimiento completo alt-command-r.

información relacionada