# Emulador de terminal

Un emulador de terminal o emulador de consola es un programa informático que simula el funcionamiento de un terminal de computadora en cualquier dispositivo de visualización. Normalmente suele estar accesible pulsando CTRL + ALT + T simultáneamente. Un emulador de terminal dentro de una interfaz gráfica de usuario es comúnmente conocida como una ventana de terminal.
Los emuladores de terminal incorporan características tales como control de procesos, redirección de entrada/salida, listado y lectura de ficheros, protección, comunicaciones y un lenguaje de órdenes para escribir secuencias de instrucciones por lotes o scripts. Uno de los lenguajes o intérpretes más conocidos, es el Bourne Shell, el cual fue el intérprete usado en las primeras versiones de Unix y se convirtió en un estándar de facto.
Al ingresar las órdenes en el emulador, un intérprete de comandos analiza la secuencia de caracteres ingresada y, si la sintaxis de la orden es correcta, la ejecuta, recurriendo para ello a las funciones que ofrece el sistema operativo o el programa que representa, bien sea un gestor de banco de datos, una sesión de FTP, etc. La respuesta al usuario se representa en el monitor; es una forma de trabajo interactiva, es decir, usuario y máquina se comunican en forma sucesiva.

## Historia

Desde sus inicios, los ordenadores contaban con pequeños terminales de texto para interactuar con sus usuarios. Un terminal se compone únicamente de un teclado y una pantalla capaz de mostrar texto. Estas terminales se conectaban a la computadora a través de una interfaz serie (más o menos, un simple cable). Un ordenador podía tener conectados varios terminales simultáneamente.
Con la proliferación de los miniordenadores, una misma persona estaba obligada a manejar varios terminales sobre su mesa, uno por cada ordenador. Dado que estos ordenadores ya disponían de redes de comunicaciones, se hizo patente la idoneidad de poder controlar varios ordenadores desde un mismo terminal. Para hacer esto posible, se escribió un programa emulador que básicamente, permite a un ordenador simular ser un terminal de otro ordenador. Así nacieron los primeros emuladores de terminal para Unix.
La utilidad del emulador de terminal se hizo aún mayor con la llegada de los ordenadores personales a las empresas. Los trabajadores ahora tenían un ordenador de escritorio y un terminal sobre su mesa. Esto no solamente significaba un incordio para el trabajador. También suponía un sobrecoste para la empresa ya que tenía que mantener dos equipos distintos, la red de comunicaciones y las conexiones serie de los terminales. El uso de un emulador de terminal permitía eliminar el viejo terminal físico así como todos los cables serie, dando valor añadido a la red de comunicaciones. Además el coste de la licencia de un emulador de terminal es sensiblemente inferior al coste de un terminal físico.
Hoy día los emuladores de terminal para ordenador personal siguen en uso en aquellas organizaciones que mantienen sistemas centrales (como bancos y Administraciones Públicas), así como en la mayoría de sistemas operativos modernos, de los cuales cabe destacar GNU/Linux, ya que los usuarios avanzados de este último suelen usar los emuladores de terminal para la mayoría de tareas de administración del sistema.
Los emuladores de terminal tienen su evolución en los modernos escritorios remotos.

## Tipología

Todos los emuladores de terminal son muy simples, se limitan a enviar y recibir caracteres de texto a través de una red de comunicaciones. Los caracteres enviados se corresponden con pulsaciones en el teclado y los caracteres recibidos corresponden con la pantalla visualizada. Lo único que los diferencia es el tipo de terminal físico emulado. Aunque existe una gran variedad de terminales (tanto físicos como emulados), casi todos ellos son variaciones de dos modelos básicos:
* La gama VT-100. Se trata de terminales fabricados por DEC y utilizados principalmente en sus ordenadores VAX y posteriores. Especialmente popular es el modelo VT-320.
* La gama 3270. Son terminales fabricados por IBM para todos sus ordenadores centrales. Son más sofisticados que los terminales VT-100 ya que disponen de cursor y campos que el usuario puede rellenar antes de ser enviados al ordenador central. Es decir, no se envía cada pulsación de tecla sino el conjunto de todo lo tecleado en la pantalla una vez que se pulsa la tecla "Enter".
La diferencia entre terminales está en el juego de caracteres empleados, los códigos de control que emplean (por ejemplo, para borrar la pantalla) y los diferentes códigos de carácter que corresponden a cada tecla.

## Algunos emuladores de terminal

El emulador de terminal por excelencia es Telnet. Se trata de una aplicación estándar de la pila de protocolos TCP/IP. Sin embargo, Telnet es un emulador de "mínimo común denominador", es decir, excesivamente simple.
En los ordenadores Unix el emulador de terminal por defecto es Term, que tiene su versión para escritorio gráfico en xterm. Este tiene algunas mejoras como la posibilidad de visualizar texto en color mediante ciertos códigos de control.
En el campo de los ordenadores personales destacan PuTTY y ssh. No obstante, estos dejan fuera los terminales 3270. Los productos comerciales más extendidos son Extra! y Reflection de la compañía AttachmateWRQ.
Con la proliferación de las tecnologías Web, algunas compañías como Jacada y AttatchmateWRQ tratan de comercializar una nueva generación de emuladores que se ejecutan en el navegador Web, bien directamente (mediante un applet), bien mediante un servidor intermedio (una aplicación Web). Además, AttachmateWRQ ofrece soluciones para la integración de aplicaciones web mediante su solución VERASTREAM . Esta solución, por otro lado, permite modernizar la aplicación legacy (residente en el host) y darle un aspecto web.

## Categorías de shell

Pueden dividirse en cuatro categorías: tipo Bourne, tipo consola C, no tradicional e histórica.

### Compatibles con Bourne shell

* Bourne shell (sh) -- Escrita por Steve Bourne, cuando estaba en Bell Labs. Se distribuyó por primera vez con la UNIX Versión 7, en 1978, y se mejoró con los años.
* Almquist shell (ash) -- Se escribió como reemplazo de la shell Bourne con licencia BSD; la sh de FreeBSD, NetBSD (y sus derivados) están basados en ash y se han mejorado conforme a POSIX para la ocasión.
* Bourne-Again shell (bash) -- Se escribió como parte del proyecto GNU para proveerlo de un superconjunto de funcionalidad con la shell Bourne, suele ser la shell por defecto en la mayoría de las distribuciones GNU/Linux.
* Debian Almquist Shell (dash) -- Dash es un reemplazo moderno de ash en Debian.
* Korn shell (ksh) -- Escrita por David G. Korn, mientras estuvo en Bell Labs.
* Z shell (zsh) -- Considerada como la más completa: es lo más cercano que existe en abarcar un superconjunto de sh, ash, bash, csh, ksh, and tcsh.

### Compatibles con la shell de C

* C shell (csh) escrita por Bill Joy, mientras estuvo en la University of California, Berkeley. Se distribuyó por primera vez con BSD en 1979.
* TENEX C shell (tcsh).

### Otros o exóticos

* fish, una shell amigable e interctiva, lanzada por primera vez en 2005.
* mudsh, una shell inteligente al estilo de los videojuegos que opera como un MUD.
* zoidberg, una shell modular escrita en Perl, configurada y de operación completamente en Perl.
* rc, el shell por defecto de Plan 9 from Bell Labs y Unix Versión 10 escrita por Tom Duff. Se han hecho compilaciones para Inferno y para sistemas operativos basados en Unix.
* es shell (es), una shell compatible con rc escrita a mediados de los 90.
* scsh (Scheme Shell).

### Archivos de configuración para shells

Un shell lee archivos de configuración en múltiples circunstancias bajo diferentes dependencias de la shell. Esta tabla muestra los archivos de configuración de las shells más populares:
| | sh | ksh | csh | tcsh | bash | zsh |
| /etc/.login | no | no | login | login | no | no |
| /etc/csh.cshrc | no | no | no | yes | no | no |
| /etc/csh.login | no | no | no | login | no | no |
| ~/.tcshrc | no | no | no | yes | no | no |
| ~/.cshrc | no | no | yes | yes | no | no |
| ~/.login | no | no | login | login | no | no |
| ~/.logout | no | no | login | login | no | no |
| /etc/profile | login | login | no | no | i.login | no |
| ~/.profile | login | login | no | no | login | no |
| ~/.bash_profile | no | no | no | no | login | no |
| ~/.bash_login | no | no | no | no | login | no |
| ~/.bashrc | no | no | no | no | n/login | no |
| /etc/zshenv | no | no | no | no | no | yes |
| /etc/zprofile | no | no | no | no | no | login |
| /etc/zshrc | no | no | no | no | no | int. |
| /etc/zlogin | no | no | no | no | no | login |
| /etc/zlogout | no | no | no | no | no | login |
| ~/.zshenv | no | no | no | no | no | yes |
| ~/.zprofile | no | no | no | no | no | login |
| ~/.zshrc | no | no | no | no | no | int. |
| ~/.zlogin | no | no | no | no | no | login |
| ~/.zlogout | no | no | no | no | no | login |
Explicación:
* "no" significa que la shell no leerá el archivo en absoluto.
* "yes" significa que el archivo es siempre leído por el shell.
* "login" significa que el archivo es leído si la shell es una shell de sesión (loging shell).
* "n/login" significa que el archivo is leído si la shell no es una shell de sesión.
* "int." significa que un archivo es leído si es un shell interactivo.
* "i.login" significa que un archivo is leído si la shell es de sesión interactiva.

### Histórico

* Thompson shell (sh) -- La primel shell Unix fue escrita por Ken Thompson en Bell Labs. Distribuida con la versión 1 hasta la 6 de Unix, desde 1971 a 1975. Es considerada muy rudimentaria para los estandarés modernos y no es usada en sistemas actuales. Existen algunas partes disponibles de la misma: Ancient UNIX Systems.
* PWB shell o Mashey shell (sh) -- Una versión de la shell de Thompson, creada por John Mashey y otros, mientras estuvieron en Bell Labs. Distribuida con el Programmer's Workbench UNIX, en 1976.

## Shells no Unix

Dentro del conjunto de sistemas operativos Microsoft Windows, el análogo son los programas command.com, o cmd.exe para sistemas operativos basados en Windows NT, y Windows PowerShell introducido con Windows Server 2008.

## Nomenclaturas

Pocos términos usados en computación han sufrido tantos avatares a lo largo del progreso técnico tan intensamente como el de intérprete de comandos (tales como consola, CLI, TUI, TTY, terminal o shell).
Históricamente, la consola era un terminal de datos (es decir, un dispositivo físico), pero como dichos aparatos ya casi no existen, la palabra pasó a utilizarse como sinónimo de "pantalla del CLI". La expresión consola se utiliza más comúnmente en juegos de PC para referirse a la ventana donde se pueden ingresar comandos.
Por otro lado, un emulador de terminal (o TTY) es un programa que permite imitar aquellos viejos terminales, para acceder a diversos servicios aún vigentes bajo ese tipo de formato (como Telnet). Ejemplos de estos programas son: HyperTerminal, Xterm, PuTTY y SSH.
Con el desarrollo de los GUI, los sistemas de ventanas proveen alguna clase de emulación para el modo texto, para ejecutar correctamente programas que utilizan TUI (como el Midnight Commander de Linux). De esta forma, tanto los shells de Unixes (bajo X) como los antiguos programas de DOS (bajo MS Windows) son ejecutados con este emulador del modo texto. Y, lo que es aún más, algunos importantes programas (como Bash), actúan también como emuladores de terminal. De esta manera, las expresiones emulador de texto, consola y terminal acaban usándose en ocasiones como sinónimos.
Es común mezclar las tres cosas para referirse a un solo concepto: el sitio donde se puede usar la interfaz de líneas de comando.
Por ejemplo, si conectamos un teclado y un monitor a un PC y lo hacemos arrancar con GNU/Linux en modo texto, la mayoría de los usuarios dirá que tiene una shell. Si desde esa shell se arranca el modo gráfico KDE del mismo PC, la pantalla se iluminará con trasfondos y botones. Si se abre una ventana con el programa xterm, se le llamará consola. Si en esa consola ejecutamos SSH y nos comunicamos a través de la red con un computador remoto, diremos que tenemos un terminal abierto. En los tres casos trabajaremos con una shell, digamos Bash, y las diferencias de funcionalidad son mínimas.