En informática , un shell es un programa informático que expone los servicios de un sistema operativo a un usuario humano o a otros programas. En general, los shells de 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 su operación particular. Se denomina shell porque es la capa más externa del sistema operativo. [1] [2]
Los sistemas operativos brindan diversos servicios a sus usuarios, entre los que se incluyen administración de archivos , administración de procesos (ejecución y finalización de aplicaciones ), procesamiento por lotes y monitoreo y configuración del sistema operativo.
La mayoría de los shells de sistemas operativos no son interfaces directas con el núcleo 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 núcleo de la misma manera que lo utilizan otros programas de aplicación. Un shell administra la interacción usuario-sistema solicitando a los usuarios que ingresen información, interpretando su entrada y luego manejando la salida del sistema operativo subyacente (de manera muy similar a un bucle de lectura-evaluación-impresión, REPL ). [3] Dado que el shell del sistema operativo es en realidad una aplicación, puede reemplazarse 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 generalmente se conocen como 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 serial 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) se usa generalmente para shells basados en texto, mientras que la tunelización SSH se puede usar para interfaces gráficas de usuario (GUI) basadas en X Window System . En Microsoft Windows, el Protocolo de escritorio remoto se puede usar para proporcionar acceso remoto GUI y, desde Windows Vista , PowerShell Remote se puede usar para acceso remoto basado en texto a través de WMI, RPC y WS-Management. [4]
La mayoría de los shells de sistemas operativos se dividen en dos categorías: de línea de comandos y gráficos. Los shells de línea de comandos proporcionan una interfaz de línea de comandos (CLI) al 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ú basados en texto. Los méritos relativos de los shells basados en CLI y GUI son a menudo objeto de debate. Muchos usuarios de computadoras 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 podía tener diferentes nombres, como COMCON
en los sistemas DEC TOPS-10 . [5] El intérprete ejecutaba uno de varios comandos predefinidos, uno de los cuales era ejecutar un programa de usuario. Los comandos comunes registraban y cerraban la sesión del usuario en el sistema, asignaban, liberaban y manipulaban dispositivos y archivos, y consultaban varios datos sobre el sistema o un proceso de usuario. [6]
El objetivo de este procedimiento es crear un medio de intercambio en el que se pueda activar cualquier procedimiento, como si se lo llamara desde dentro de otro programa . En adelante, para simplificar, nos referiremos a ese procedimiento como "SHELL".
Louis Pouzin, The 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 "utilizar 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 siempre que un usuario escribe algún mensaje en su consola, en un momento en que no tiene otro proceso en ejecución activa bajo el control de la consola. Este 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. Esta 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 comandos que la contiene. Las funciones activas se utilizan a menudo... para implementar macros de lenguaje de comandos. [11]
En 1971, Ken Thompson desarrolló el shell Thompson en la primera versión de Unix. Si bien era más simple que el shell Multics, contenía algunas características innovadoras que se han trasladado a 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 Conferencia Conjunta de Computadoras de Otoño 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 de Palo Alto (PARC) de Xerox, donde apareció en el Alto , presentado en 1973. De allí, la idea se extendió a Lilith de Niklaus Wirth en 1980 y a Apple Lisa en 1983, para luego volverse 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 un programa de 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 línea de base. Algunos sistemas operativos tenían solo un estilo único de interfaz de comandos; los sistemas operativos básicos como MS-DOS venían con una interfaz de comandos estándar ( COMMAND.COM ), pero también había interfaces de terceros disponibles a menudo, 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 una serie de comandos para controlar un enlace a un sistema informático remoto. Dado que los comandos del programa están formados por las mismas pulsaciones de teclas que los datos que se envían a un ordenador remoto, 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 es interpretada por el sistema local. El programa se vuelve modal, alternando entre la interpretación de comandos del teclado o el envío de pulsaciones de teclas como datos para su procesamiento.
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 los hubiera escrito un usuario. Pueden aplicarse características especiales en la CLI cuando está ejecutando estas instrucciones almacenadas. Dichos archivos por lotes (archivos de script) se pueden utilizar repetidamente para automatizar operaciones rutinarias, como la inicialización de un conjunto de programas cuando se reinicia un sistema. El uso del modo por lotes de los shells generalmente implica estructuras, condicionales, variables y otros elementos de lenguajes de programación; algunos tienen lo esencial necesario 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 un shell de sistema operativo o en un programa creado específicamente para ese fin.
Varios shells de línea de comandos, como Xonsh, Bash (shell de Unix) y Z shell , ofrecen finalización de línea de comandos , lo que permite al intérprete expandir comandos en función de 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 al sistema operativo debían ser escritos por el usuario, los nombres de comando cortos y los sistemas compactos para representar las opciones del programa eran comunes. Los nombres cortos a veces eran difíciles de recordar para un usuario, y los primeros sistemas carecían de los recursos de almacenamiento para proporcionar una guía de instrucciones detallada 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 estar incluidos en los entornos de escritorio o venir por separado, incluso como un conjunto de utilidades acopladas de forma flexible.
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 de 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 suelen construirse sobre un sistema de ventanas . En el caso de X Window System o Wayland , el shell consta de un gestor de ventanas X o un compositor Wayland , respectivamente, así como de uno o varios programas que proporcionan la funcionalidad para iniciar aplicaciones instaladas, gestionar ventanas abiertas y escritorios virtuales y, a menudo, dar soporte a un motor de widgets.
En el caso de macOS , Quartz Compositor actúa como sistema de ventanas, y el shell consta del Finder , [13] el Dock , [13] SystemUIServer, [13] y Mission Control . [14]
Las versiones modernas del sistema operativo Microsoft Windows utilizan el shell de Windows como su 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 más antiguas también incluyen el Administrador de programas , que era el shell para la serie 3.x de Microsoft Windows y que, de hecho, se incluía con versiones posteriores de Windows, tanto de tipo 95 como de 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 de Windows Explorer 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 del segundo.
Los programas de interoperabilidad y el software diseñado específicamente para este fin 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 del OS/2 Presentation Manager para la versión 3.0 puede ejecutar algunos programas de OS/2 en determinadas condiciones utilizando el subsistema de entorno de OS/2 en versiones de Windows NT.
El término "shell" también se utiliza de forma imprecisa para describir el software de aplicación que está "construido en torno" a un componente en particular, como los navegadores web y los clientes de correo electrónico, en analogía con los shells que se encuentran en la naturaleza. De hecho, el shell (de línea de comandos) encapsula el núcleo del sistema operativo . A veces también se los denomina "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 una "cáscara" alrededor de las entrañas zumbantes 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 se esconden debajo de 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 computación remota mediante el uso de varias tecnologías, incluidas WMI, RPC y WS-Management.