En informática , un shell es un programa informático que expone los servicios de un sistema operativo a un usuario humano u otros programas. En general, los shells de los sistemas operativos utilizan una interfaz de línea de comandos (CLI) o una interfaz gráfica de usuario (GUI), según la función de la computadora y la operación particular. Se denomina shell porque es la capa más externa alrededor del sistema operativo. [1] [2]
Los sistemas operativos brindan diversos servicios a sus usuarios, incluida la administración de archivos , la administración de procesos (ejecución y finalización de aplicaciones ), el procesamiento por lotes y el monitoreo y configuración del sistema operativo.
La mayoría de los shells de los sistemas operativos no son interfaces directas al kernel subyacente , incluso si un shell se comunica con el usuario a través de dispositivos periféricos conectados directamente a la computadora. Los shells son en realidad aplicaciones especiales que utilizan la API del kernel de la misma manera que la utilizan otros programas de aplicación. Un shell gestiona la interacción usuario-sistema solicitando a los usuarios entradas, interpretando sus entradas y luego manejando la salida del sistema operativo subyacente (muy parecido a un bucle de lectura, evaluación e impresión, REPL ). [3] Dado que el shell del sistema operativo es en realidad una aplicación, se puede reemplazar fácilmente con otra aplicación similar, para la mayoría de los sistemas operativos.
Además de los shells que se ejecutan en sistemas locales, existen diferentes formas de hacer que los sistemas remotos estén disponibles para los usuarios locales; Estos enfoques suelen denominarse acceso remoto o administración remota. Inicialmente disponible en mainframes multiusuario , que proporcionaban interfaces de usuario basadas en texto para cada usuario activo simultáneamente por medio de un terminal de texto conectado al mainframe a través de una línea serie o módem , el acceso remoto se ha extendido a sistemas tipo Unix y Microsoft Windows. En sistemas tipo Unix, el protocolo Secure Shell (SSH) generalmente se usa para shells basados en texto, mientras que el túnel SSH se puede usar para interfaces gráficas de usuario (GUI) basadas en el sistema X Window . En Microsoft Windows, se puede utilizar el Protocolo de escritorio remoto para proporcionar acceso remoto a la GUI y, desde Windows Vista , PowerShell Remote se puede utilizar para acceso remoto basado en texto a través de WMI, RPC y WS-Management. [4]
La mayoría de los shells de los sistemas operativos se clasifican en una de dos categorías: línea de comandos y gráficos. Los shells de línea de comandos proporcionan una interfaz de línea de comandos (CLI) para el sistema operativo, mientras que los shells gráficos proporcionan una interfaz gráfica de usuario (GUI). Otras posibilidades, aunque no tan comunes, incluyen una interfaz de usuario de voz y varias implementaciones de una interfaz de usuario basada en texto (TUI) que no son CLI, como los sistemas de menús basados en texto. A menudo se debaten los méritos relativos de los shells basados en CLI y GUI. Muchos usuarios de ordenadores utilizan ambos dependiendo de la tarea a realizar.
Los primeros sistemas interactivos proporcionaban un intérprete de línea de comandos simple como parte del monitor residente . Este intérprete puede recibir diferentes nombres, como COMCON
en los sistemas DEC TOPS-10 . [5] El intérprete ejecutaría uno de varios comandos predefinidos, uno de los cuales sería ejecutar un programa de usuario. Los comandos comunes iniciarían y cerrarían la sesión del usuario en el sistema, asignarían, liberarían y manipularían dispositivos y archivos, y consultarían diversos datos sobre el sistema o un proceso de usuario. [6]
El propósito de tal procedimiento es crear un medio de intercambio en el que se pueda activar cualquier procedimiento, como si fuera llamado desde el interior de otro programa . En adelante, para simplificar, nos referiremos a ese procedimiento como "SHELL".
Louis Pouzin, SHELL: una herramienta global para llamar y encadenar procedimientos en el sistema [7]
En 1964, para el sistema operativo Multics , Louis Pouzin concibió la idea de "usar comandos de alguna manera como un lenguaje de programación" y acuñó el término shell para describirlo. [8] En un documento de 1965, el shell se define como "un procedimiento común llamado automáticamente por el supervisor cada vez que un usuario escribe algún mensaje en su consola, en un momento en el que no tiene ningún otro proceso en ejecución activa bajo el control de la consola. Este El procedimiento actúa como una interfaz entre los mensajes de la consola y la subrutina [en el supervisor]". [9] Este sistema fue implementado por primera vez por Glenda Schroeder y un hombre anónimo de General Electric . [10]
Multics también introdujo la función activa , un concepto clave en todos los shells posteriores. Esto se define como
una cadena... que se reemplaza por un valor de retorno de cadena de caracteres antes de que se ejecute la línea de comando que la contiene. Las funciones activas se utilizan a menudo... para implementar macros en lenguaje de comandos. [11]
En 1971, Ken Thompson desarrolló el shell Thompson en la primera versión de Unix. Si bien es más simple que el shell Multics, contiene algunas características innovadoras que se han implementado en los shells modernos, incluido el uso de < y > para la redirección de entrada y salida .
El shell gráfico apareció por primera vez en el sistema NLS de Douglas Engelbart , demostrado en diciembre de 1968 en la Fall Joint Computer Conference en San Francisco, en lo que se ha llamado La madre de todas las demostraciones . Los colegas de Engelbart en el Instituto de Investigación de Stanford llevaron el concepto al Centro de Investigación Xerox de Palo Alto (PARC), donde apareció en el Alto , presentado en 1973. Desde allí, la idea se extendió a la Lilith de Niklaus Wirth en 1980, y al Apple Lisa en 1980. 1983, luego se volvió omnipresente.
Una interfaz de línea de comandos (CLI) es un shell del sistema operativo que utiliza caracteres alfanuméricos escritos en un teclado para proporcionar instrucciones y datos al sistema operativo de forma interactiva. Por ejemplo, un teletipo puede enviar códigos que representan pulsaciones de teclas a un programa intérprete de comandos que se ejecuta en la computadora; el intérprete de comandos analiza la secuencia de pulsaciones de teclas y responde con un mensaje de error si no puede reconocer la secuencia de caracteres, o puede llevar a cabo alguna otra acción del programa, como cargar una aplicación, enumerar archivos, iniciar sesión como usuario y muchas otras. Los sistemas operativos como UNIX tienen una gran variedad de programas de shell con diferentes comandos, sintaxis y capacidades, siendo el shell POSIX la base. Algunos sistemas operativos tenían un solo estilo de interfaz de comando; Los sistemas operativos básicos como MS-DOS venían con una interfaz de comando estándar ( COMMAND.COM ), pero a menudo también estaban disponibles interfaces de terceros, que proporcionaban características o funciones adicionales como menús o ejecución remota de programas.
Los programas de aplicación también pueden implementar una interfaz de línea de comandos. Por ejemplo, en sistemas tipo Unix, el programa telnet tiene varios comandos para controlar un enlace a un sistema informático remoto. Dado que los comandos del programa se componen de las mismas pulsaciones de teclas que los datos que se envían a una computadora remota, se requieren algunos medios para distinguirlos. Se puede definir una secuencia de escape utilizando una pulsación de tecla local especial que nunca se transmite pero que siempre interpreta el sistema local. El programa se vuelve modal, alternando entre interpretar comandos del teclado o pasar pulsaciones de teclas como datos para procesar.
Una característica de muchos shells de línea de comandos es la capacidad de guardar secuencias de comandos para su reutilización. Un archivo de datos puede contener secuencias de comandos que la CLI puede seguir como si las hubiera escrito un usuario. Es posible que se apliquen funciones especiales en la CLI cuando se llevan a cabo estas instrucciones almacenadas. Estos archivos por lotes (archivos de script) se pueden utilizar repetidamente para automatizar operaciones de rutina, como inicializar un conjunto de programas cuando se reinicia un sistema. El uso de shells en modo por lotes generalmente involucra estructuras, condicionales, variables y otros elementos de los lenguajes de programación; algunos tienen los elementos esenciales necesarios para tal propósito, otros son lenguajes de programación muy sofisticados en sí mismos. Por el contrario, algunos lenguajes de programación se pueden utilizar de forma interactiva desde el shell de un sistema operativo o en un programa diseñado específicamente.
Varios shells de línea de comandos, como Xonsh, Bash (shell Unix) y Z shell , ofrecen finalización de línea de comandos , lo que permite al intérprete expandir comandos basándose en unos pocos caracteres ingresados por el usuario. [12]
Un intérprete de línea de comandos puede ofrecer una función de historial, de modo que el usuario pueda recordar comandos anteriores emitidos al sistema y repetirlos, posiblemente con alguna edición. Dado que todos los comandos del sistema operativo debían ser escritos por el usuario, eran comunes los nombres de comandos cortos y los sistemas compactos para representar las opciones del programa. A veces, los nombres cortos eran difíciles de recordar para el usuario y los primeros sistemas carecían de recursos de almacenamiento para proporcionar una guía detallada de instrucciones para el usuario en línea.
Una interfaz gráfica de usuario (GUI) proporciona medios para manipular programas gráficamente, permitiendo operaciones como abrir, cerrar, mover y cambiar el tamaño de ventanas , así como cambiar el foco entre ventanas. Los shells gráficos pueden incluirse con los entornos de escritorio o venir por separado, incluso como un conjunto de utilidades poco acopladas.
La mayoría de las interfaces gráficas de usuario desarrollan la metáfora de un "escritorio electrónico" , donde los archivos de datos se representan como si fueran documentos en papel sobre un escritorio, y los programas de aplicación de manera similar tienen representaciones gráficas en lugar de ser invocados por nombres de comandos.
Los shells gráficos normalmente se construyen sobre un sistema de ventanas . En el caso de X Window System o Wayland , el shell consta de un administrador de ventanas X o un compositor Wayland , respectivamente, así como de uno o varios programas que brindan la funcionalidad de iniciar aplicaciones instaladas, administrar ventanas abiertas y escritorios virtuales, y a menudo para admitir un motor de widgets.
En el caso de macOS , Quartz Compositor actúa como sistema de ventanas y el shell consta del Finder , [13] Dock , [ 13] SystemUIServer, [13] y Mission Control . [14]
Las versiones modernas del sistema operativo Microsoft Windows utilizan el shell de Windows como shell. Windows Shell proporciona un entorno de escritorio , un menú de inicio y una barra de tareas , así como una interfaz gráfica de usuario para acceder a las funciones de administración de archivos del sistema operativo. Las versiones anteriores también incluyen el Administrador de programas , que era el shell de la serie 3.x de Microsoft Windows y que, de hecho, se incluía en versiones posteriores de Windows de tipo 95 y NT, al menos hasta Windows XP. Las interfaces de las versiones 1 y 2 de Windows eran marcadamente diferentes.
Las aplicaciones de escritorio también se consideran shells, siempre que utilicen un motor de terceros. Asimismo, muchas personas y desarrolladores insatisfechos con la interfaz del Explorador de Windows han desarrollado software que altera el funcionamiento y la apariencia del shell o lo reemplaza por completo. WindowBlinds de StarDock es un buen ejemplo del primer tipo de aplicación. LiteStep y Emerge Desktop son buenos ejemplos de este último.
Los programas de interoperabilidad y el software diseñado específicamente permiten a los usuarios de Windows utilizar equivalentes de muchas de las diversas GUI basadas en Unix que se analizan a continuación, así como de Macintosh. Un equivalente de OS/2 Presentation Manager para la versión 3.0 puede ejecutar algunos programas OS/2 bajo ciertas condiciones usando el subsistema ambiental OS/2 en versiones de Windows NT.
"Shell" también se usa libremente para describir una aplicación de software que está "construida alrededor" de un componente particular, como navegadores web y clientes de correo electrónico, en analogía con los shells que se encuentran en la naturaleza. De hecho, el shell (línea de comandos) encapsula el núcleo del sistema operativo . A veces también se les llama "envoltorios". [2]
En los sistemas expertos , un shell es una pieza de software que es un sistema experto "vacío" sin la base de conocimientos para ninguna aplicación en particular. [15]
Pouzin creó un programa llamado RUNCOM que ayudaba a los usuarios a automatizar comandos tediosos y repetitivos. Ese programa, que describió como un "caparazón" alrededor de las entrañas de la computadora, dio inspiración (y un nombre) a toda una clase de herramientas de software, llamadas shells de línea de comandos, que aún acechan bajo la superficie de los sistemas operativos modernos.
Puede ejecutar comandos en una o cientos de computadoras con un solo comando de PowerShell. Windows PowerShell admite la informática remota mediante el uso de diversas tecnologías, incluidas WMI, RPC y WS-Management.