Un shell de Unix es un intérprete de línea de comandos o shell que proporciona una interfaz de usuario de línea de comandos para sistemas operativos tipo Unix . El shell es a la vez un lenguaje de comandos interactivo y un lenguaje de scripts , y es utilizado por el sistema operativo para controlar la ejecución del sistema mediante scripts de shell . [2]
Los usuarios suelen interactuar con un shell de Unix mediante 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 en los sistemas de servidor. Todos los shells de Unix proporcionan comodines en los nombres de archivo , canalización , documentos here , sustitución de comandos , variables y estructuras de control para pruebas de condiciones e iteración .
En general, 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 al pasar 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 Linux de escritorio , es posible que algunos usuarios nunca utilicen el shell directamente. En 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, desde 1971 hasta 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, incluyendo canalización, estructuras de control simples usando if
y goto
y comodines en los nombres de archivo. Aunque no se usa 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 , fue una versión compatible con el shell Thompson, ampliada por John Mashey y otros y distribuida con Programmer's Workbench UNIX , alrededor de 1975-1977. Se centró en hacer que la programación de shell fuera práctica, especialmente en grandes centros de computación compartidos. Añadió variables de shell (precursoras de las variables de entorno , incluido el mecanismo de ruta de búsqueda que evolucionó en $PATH), scripts de shell ejecutables por el usuario y manejo de interrupciones. Las estructuras de control se ampliaron de if/goto a if/then/else/endif, switch/breaksw/endsw y while/end/break/continue. A medida que la programación de shell se generalizó, estos comandos externos se incorporaron al propio shell para mejorar el rendimiento.
Pero los shells de Unix más ampliamente distribuidos e influyentes 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 similares con conjuntos de características ampliados. [5]
El shell Bourne , sh , fue un nuevo shell de Unix creado por Stephen Bourne en Bell Labs. [6] Distribuido como el 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, incluyendo here documents , command substitution , variables más genéricas y estructuras de control integradas más extensas . El lenguaje, incluyendo el uso de una palabra clave reversed 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 de Unix es /bin/sh . Pero también hay disponibles varios programas similares compatibles con varias mejoras y características adicionales. En muchos sistemas, sh puede ser un enlace simbólico o un enlace duro a una de estas alternativas:
El estándar POSIX especifica que su shell estándar es 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 gracias a su carácter característico de línea de comandos predeterminada, el signo de dólar ( $ ).
El shell C , csh , se basó en 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 C shell también introdujo muchas características para el trabajo interactivo, incluyendo los mecanismos de historial y 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 duro a TENEX C shell (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 otros shells, la estructura del lenguaje no ha sido ampliamente copiada. El único trabajo 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; normalmente se utilizan para establecer variables importantes que se utilizan para encontrar ejecutables, como $PATH y otras que controlan el comportamiento y la apariencia del shell. La tabla de esta sección muestra los archivos de configuración de los shells más populares. [11]
Archivo de configuración | ella | ksh | csh | Tcsh-español:Tcsh-español: | intento | zsh |
---|---|---|---|---|---|---|
/etc/.login | acceso | acceso | ||||
/etc/csh.cshrc | Sí | Sí | ||||
/etc/csh.login | acceso | acceso | ||||
~/.tcshrc | Sí | |||||
~/.cshrc | Sí | Sí [a] | ||||
/etc/ksh.kshrc | en t. | |||||
/etc/sh.shrc | int. [b] | |||||
$ENV (normalmente ~/.kshrc ) [12] | int. [c] [d] | en t. | int. [e] | |||
~/.inicio de sesión | acceso | acceso | ||||
~/.cerrar sesión | acceso | acceso | ||||
/etc/perfil | acceso | acceso | acceso | iniciar sesión [f] | ||
~/.perfil | acceso | acceso | iniciar sesión [g] | iniciar sesión [f] | ||
~/.bash_perfil | iniciar sesión [g] | |||||
~/.bash_login | iniciar sesión [g] | |||||
~/.bash_cerrar sesión | acceso | |||||
~/.bashrc | int.+n/inicio de sesión | |||||
/etc/zshenv | Sí | |||||
/etc/perfilz | acceso | |||||
/etc/zshrc | en t. | |||||
/etc/zlogin | acceso | |||||
/etc/zcerrar sesión | acceso | |||||
~/.zshenv | Sí | |||||
~/.zperfil | acceso | |||||
~/.zshrc | en t. | |||||
~/.zlogin | acceso | |||||
~/.zcerrar sesión | acceso |
Explicación:
Las variaciones del concepto de shell de Unix que no se derivan de Bourne shell o C shell incluyen las siguientes: [15]
En lugar de inventar un nuevo lenguaje de script, construimos un sistema de ingreso de formularios modificando el shell Bourne y agregando comandos integrados según fuera necesario.