Un shell Unix es un intérprete o shell de línea de comandos que proporciona una interfaz de usuario de línea de comandos para sistemas operativos similares a Unix . El shell es a la vez un lenguaje de comandos interactivo y un lenguaje de secuencias de comandos , y el sistema operativo lo utiliza para controlar la ejecución del sistema mediante secuencias de comandos de shell . [2]
Los usuarios suelen interactuar con un shell Unix utilizando un emulador de terminal ; sin embargo, la operación directa a través de conexiones de hardware en serie o Secure Shell es común para los sistemas de servidor. Todos los shells de Unix proporcionan comodines para nombres de archivos , tuberías , aquí documentos , sustitución de comandos , variables y estructuras de control para pruebas de condiciones e iteraciones .
Generalmente, un shell es un programa que ejecuta otros programas en respuesta a comandos de texto. Un shell sofisticado también puede cambiar el entorno en el que se ejecutan otros programas pasando variables con nombre , una lista de parámetros o una fuente de entrada.
En los sistemas operativos tipo Unix, los usuarios suelen tener muchas opciones de intérpretes de línea de comandos para sesiones interactivas. Cuando un usuario inicia sesión en el sistema de forma interactiva, se ejecuta automáticamente un programa de shell durante la sesión. El tipo de shell, que puede personalizarse para cada usuario, normalmente se almacena en el perfil del usuario, por ejemplo en el archivo passwd local o en un sistema de configuración distribuido como NIS o LDAP ; sin embargo, el usuario puede ejecutar cualquier otro shell disponible de forma interactiva.
En sistemas operativos con un sistema de ventanas , como macOS y distribuciones de Linux de escritorio , es posible que algunos usuarios nunca utilicen el shell directamente. En los sistemas Unix, el shell ha sido históricamente el lenguaje de implementación de los scripts de inicio del sistema, incluido el programa que inicia un sistema de ventanas, configura la red y muchas otras funciones esenciales. Sin embargo, algunos proveedores de sistemas han reemplazado el sistema de inicio tradicional basado en shell ( init ) con enfoques diferentes, como systemd .
El primer shell de Unix fue el shell Thompson , sh , escrito por Ken Thompson en Bell Labs y distribuido con las versiones 1 a 6 de Unix, de 1971 a 1975. [3] Aunque rudimentario para los estándares modernos, introdujo muchas de las características básicas comunes a todos los shells de Unix posteriores, incluidas tuberías, estructuras de control simples que utilizan if
y goto
y comodines en el nombre de archivo. Aunque no se utiliza actualmente, todavía está disponible como parte de algunos sistemas UNIX antiguos .
Fue modelado a partir del shell Multics , desarrollado en 1965 por la ingeniera de software estadounidense Glenda Schroeder . El shell Multics de Schroeder fue modelado a partir del programa RUNCOM que Louis Pouzin mostró al equipo Multics. El sufijo "rc" en algunos archivos de configuración de Unix (por ejemplo, ".vimrc") es un remanente de la ascendencia RUNCOM de los shells de Unix. [1] [4]
El shell PWB o shell Mashey, sh , era una versión compatible hacia arriba del shell Thompson, aumentada por John Mashey y otros y distribuida con Programmer's Workbench UNIX , alrededor de 1975-1977. Se centró en hacer práctica la programación de shell, especialmente en grandes centros informáticos compartidos. Agregó variables de shell (precursoras de las variables de entorno , incluido el mecanismo de ruta de búsqueda que evolucionó a $PATH), scripts de shell ejecutables por el usuario y manejo de interrupciones. Las estructuras de control se extendieron de if/goto a if/then/else/endif, switch/breaksw/endsw y while/end/break/continue. A medida que la programación del shell se generalizó, estos comandos externos se incorporaron al propio shell para mejorar el rendimiento.
Pero los más ampliamente distribuidos e influyentes de los primeros shells de Unix fueron el shell Bourne y el shell C. Ambos shells se han utilizado como base de codificación y modelo para muchos shells derivados y funcionales con conjuntos de características ampliadas. [5]
El shell Bourne , sh , era un nuevo shell Unix creado por Stephen Bourne en Bell Labs. [6] Distribuido como shell para UNIX Versión 7 en 1979, introdujo el resto de las características básicas consideradas comunes a todos los shells de Unix posteriores, incluidos documentos , sustitución de comandos , variables más genéricas y estructuras de control integradas más extensas . El lenguaje, incluido el uso de una palabra clave invertida para marcar el final de un bloque, fue influenciado por ALGOL 68 . [7] Tradicionalmente, el nombre del programa Bourne Shell es sh y su ruta en la jerarquía del sistema de archivos Unix es /bin/sh . Pero también están disponibles varios dispositivos similares compatibles con varias mejoras y características adicionales. En muchos sistemas, sh puede ser un enlace simbólico o un enlace físico a una de estas alternativas:
El estándar POSIX especifica su shell estándar como un subconjunto estricto del shell Korn , una versión mejorada del shell Bourne. Desde la perspectiva del usuario, el shell Bourne se reconocía inmediatamente cuando estaba activo por su característico carácter predeterminado de línea de comando, el signo de dólar ( $ ).
El shell C , csh , se modeló sobre el lenguaje de programación C, incluidas las estructuras de control y la gramática de expresiones. Fue escrito por Bill Joy cuando era estudiante de posgrado en la Universidad de California, Berkeley , y se distribuyó ampliamente con BSD Unix . [9] [ se necesita una mejor fuente ]
El shell C también introdujo muchas características para el trabajo interactivo, incluido el historial y los mecanismos de edición , alias , pilas de directorios , notación de tilde , cdpath , control de trabajos y hash de rutas . En muchos sistemas, csh puede ser un enlace simbólico o un enlace físico al shell TENEX C (tcsh), una versión mejorada de la versión original de Joy. Aunque las características interactivas de csh se han copiado a la mayoría de los demás shells, la estructura del lenguaje no se ha copiado ampliamente. El único que funciona de manera similar es Hamilton C shell , escrito por Nicole Hamilton, distribuido por primera vez en OS/2 en 1988 y en Windows desde 1992. [10]
Los shells leen archivos de configuración en diversas circunstancias. Estos archivos suelen contener comandos para el shell y se ejecutan cuando se cargan; generalmente se usan para establecer variables importantes que se usan para buscar ejecutables, como $PATH y otros que controlan el comportamiento y la apariencia del shell. La tabla de esta sección muestra los archivos de configuración para shells populares. [11]
Explicación:
Las variaciones en el concepto de shell Unix que no se derivan del shell Bourne o del shell C incluyen las siguientes: [15]
en lugar de inventar un nuevo lenguaje de escritura , creamos un sistema de entrada de formularios modificando el shell Bourne y agregando comandos integrados según fuera necesario.