java - Configuración del entorno para System.in
linux terminal (2)
Con las aplicaciones de terminal de caracteres, siempre hay dos extremos en la comunicación, que deben acordar cómo interpretar los caracteres de control. Por lo general, ambos lados son capaces de utilizar una variedad de codificaciones descritas en la terminfo
datos termcap
/ terminfo
.
En el lado del servidor de Unix , puede definir la codificación estableciendo la variable de entorno TERM
, o usando stty
(por defecto, se usa de otra manera, a menudo una emulación de terminal tonta).
En el lado del cliente , también debe establecer la misma emulación de terminal que en el lado del servidor. Telnet nativo de Windows tiene la capacidad de definir la emulación (ver, por ejemplo, Configurar el tipo de terminal Telnet ), al igual que otros emuladores de terminal (por ejemplo, Putty).
Respecto a sus decisiones de diseño : la configuración del terminal anterior generalmente solo se describe en la documentación del usuario, y no está codificada en la aplicación, para dejar más flexibilidad. Después de todo, usted no sabe de antemano qué terminal (solo un terminal de hardware simple, que admite una sola codificación de termcap, ¿no?) Que sus usuarios van a utilizar.
( Como su pregunta tiene poco que ver con Java o system.in, puede volver a considerar las etiquetas que usa ) .
Estoy diseñando una aplicación de consola para un servidor que ejecuta RedHat. Los usuarios finales deben poder ejecutar esta aplicación con cualquier terminal de su elección. (Por ejemplo, Terminal Gnome, Putty SSH / Telnet, MS Telnet Client y otros).
En la mayoría de las aplicaciones de terminal no hay nada de malo, sin embargo, cuando inicio mi programa desde una sesión de MS telnet noto que mis entradas especiales para System.in
y System.console()
vuelven completamente desordenadas. Un retroceso escribirá ^H
en la pantalla y otras teclas también escriben galimatías.
Lo he pirateado lo suficiente como para lograr que funcione de manera consistente, pero estoy seguro de que lo que estoy haciendo es asqueroso:
if (!System.getenv("TERM").equals("xterm"))
{
System.out.println("/nWARNING: The TERM type is now set to xterm/n");
final String[] cmd = { "/bin/sh", "-c", "export TERM=xterm" };
Runtime.getRuntime().exec(cmd);
}
¿Habría algún problema aquí para los terminales que no son compatibles con xterm
? Observé que el cliente de Microsoft Telnet no le permite establecer el tipo de TERM
en xterm
antes de comenzar una sesión. Una vez que se inicia la sesión, sin embargo, establecer TERM=xterm
parece resolver el problema.
¿Cómo funciona la mayoría de las aplicaciones de consola sobre este problema?
Debería examinar estas dos publicaciones, ya que están relacionadas con lo que está haciendo.
establecer variable de entorno
Como está ejecutando la consola en la parte superior del servidor Unix, redhat en su caso, también le recomendaría que busque en el comando Unix, que le permita leer la entrada en la aplicación de la consola y realice la acción de acuerdo con el entrada del usuario.
Aquí hay algunos ejemplos del uso del comando.