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 similares a Unix . El shell es tanto un lenguaje de comandos interactivo como un lenguaje de scripting , y el sistema operativo lo utiliza para controlar la ejecución del sistema mediante scripts de shell . [2]
Los usuarios normalmente interactúan con un shell de Unix usando 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 de nombre de archivo , canalizaciones , aquí documentos , sustitución de comandos , variables y estructuras de control para pruebas de condición e iteración .
Concepto
El sentido más genérico del término shell significa cualquier programa que los usuarios empleen para escribir comandos. Un shell oculta los detalles del sistema operativo subyacente y administra los detalles técnicos de la interfaz del kernel del sistema operativo , que es el componente de nivel más bajo o "más interno" de la mayoría de los sistemas operativos.
En los sistemas operativos similares a 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, un programa de shell se ejecuta automáticamente durante la duración de la sesión. El tipo de shell, que puede personalizarse para cada usuario, se almacena típicamente 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 hosts con un sistema de ventanas , como macOS , es posible que algunos usuarios nunca usen 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 diferentes enfoques, como systemd .
Conchas tempranas
El primer shell de Unix fue el shell de 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, incluida la canalización, las estructuras de control simples que usan if
y goto
, y el comodín de nombre de archivo. Aunque no se utiliza actualmente, todavía está disponible como parte de algunos sistemas UNIX antiguos .
Se inspiró en el shell Multics , desarrollado en 1965 por la ingeniera de software estadounidense Glenda Schroeder . La carcasa Multics de Schroeder se inspiró en el 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 con versiones superiores 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 de shell se generalizó, estos comandos externos se incorporaron al propio shell para su rendimiento.
Pero lo más ampliamente distribuidos e influyente de la década de cáscaras 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 similares con conjuntos de características extendidas. [5]
Cáscara de Bourne
El shell Bourne , sh , era un nuevo shell Unix de 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, incluyendo aquí documentos , sustitución de comandos , variables más genéricas y estructuras de control incorporadas 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 de shell Bourne es sh y su ruta en la jerarquía del sistema de archivos Unix es / bin / sh . Pero también se encuentran disponibles una serie de dispositivos similares de trabajo 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:
- Almquist shell (ash): escrito como un reemplazo con licencia BSD para Bourne Shell; se utiliza a menudo en entornos con recursos limitados. El sh de FreeBSD , NetBSD (y sus derivados) se basan en ash que se ha mejorado para ser compatible con POSIX .
- Busybox : un conjunto de utilidades Unix para sistemas pequeños e integrados, que incluye 2 shells: ash, un derivado del shell Almquist; y silencio, una implementación independiente de un shell Bourne.
- Shell de Debian Almquist (dash): un reemplazo moderno de ash en Debian y Ubuntu
- Shell Bourne-Again (bash): escrito como parte del Proyecto GNU para proporcionar un superconjunto de la funcionalidad Bourne Shell. Este shell se puede encontrar instalado y es el shell interactivo predeterminado para los usuarios en la mayoría de los sistemas Linux .
- KornShell (ksh): escrito por David Korn basado en las fuentes del shell Bourne [8] mientras trabajaba en Bell Labs
- Shell Korn de dominio público (pdksh)
- Shell MirBSD Korn (mksh): un descendiente de OpenBSD / bin / ksh y pdksh, desarrollado como parte de MirOS BSD
- Z shell (zsh): un shell relativamente moderno que es compatible con bash . Es el shell predeterminado en Kali Linux desde 2020.4 y macOS desde 10.15 Catalina .
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 de un usuario, el shell Bourne se reconoció inmediatamente cuando estaba activo por su característico carácter de indicador de línea de comando predeterminado, el signo de dólar ( $ ).
Cáscara de C
El shell C , csh , se inspiró en el lenguaje de programación C, incluidas las estructuras de control y la gramática de la expresión. Fue escrito por Bill Joy cuando era estudiante de posgrado en la Universidad de California, Berkeley , y se distribuyó ampliamente con BSD Unix . [9]
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 ruta . 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 se ha copiado ampliamente. El único que funciona es el shell Hamilton C , escrito por Nicole Hamilton, distribuido por primera vez en OS / 2 en 1988 y en Windows desde 1992. [10]
Archivos de configuración
Los shells leen archivos de configuración en diversas circunstancias. Estos archivos generalmente contienen comandos para el shell y se ejecutan cuando se cargan; Por lo general, se usan para establecer variables importantes que se usan 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 para shells populares. [11]
sh | ksh | csh | tcsh | intento | zsh | |
---|---|---|---|---|---|---|
/etc/.login | acceso | acceso | ||||
/etc/csh.cshrc | sí | sí | ||||
/etc/csh.login | acceso | acceso | ||||
~ / .tcshrc | sí | |||||
~ / .cshrc | sí | si [a] | ||||
~ / etc / ksh.kshrc | En t. | |||||
/etc/sh.shrc | En t. [B] | |||||
$ ENV (normalmente ~ / .kshrc) [12] | En t. [c] [d] | En t. | En t. [mi] | |||
~ / .login | acceso | acceso | ||||
~ / .logout | acceso | acceso | ||||
/ etc / profile | acceso | acceso | acceso | iniciar sesión [f] | ||
~ / .profile | acceso | acceso | iniciar sesión [g] | iniciar sesión [f] | ||
~ / .bash_profile | iniciar sesión [g] | |||||
~ / .bash_login | iniciar sesión [g] | |||||
~ / .bash_logout | acceso | |||||
~ / .bashrc | int. + n / iniciar sesión | |||||
/ etc / zshenv | sí | |||||
/ etc / zprofile | acceso | |||||
/ etc / zshrc | En t. | |||||
/ etc / zlogin | acceso | |||||
/ etc / zlogout | acceso | |||||
~ / .zshenv | sí | |||||
~ / .zprofile | acceso | |||||
~ / .zshrc | En t. | |||||
~ / .zlogin | acceso |
Explicación:
- en blanco significa que un shell no lee un archivo en absoluto.
- "sí" significa que un archivo siempre es leído por un shell al iniciarse.
- "inicio de sesión" significa que se lee un archivo si el shell es un shell de inicio de sesión.
- "n / login" significa que se lee un archivo si el shell no es un shell de inicio de sesión.
- "En t." significa que se lee un archivo si el shell es interactivo.
- ^ solo sino se encuentra ~ / .tcshrc
- ^ Sólo versiones más recientes de Bourne Shell
- ^ Disponible en sistemas que admiten la "opción de utilidades de portabilidad de usuario"; El valor de la variable debe ser unaruta absoluta y se ignora "si los ID de usuario reales y efectivos del usuario o los ID de grupo reales y efectivos son diferentes". [13]
- ^ $ ENV es $ HOME / .shrc en las versiones más recientes de Bourne Shell
- ^ El mismo comportamiento que sh , pero solo si se invoca como sh (bash 2+) o, desde bash 4.2, también si se invoca explícitamente en el modo de compatibilidad POSIX (con las opciones --posix o -o posix ). [14]
- ^ a b Solo en modo de compatibilidad sh / ksh (cuando se invoca como bash, sh, ksh)
- ^ a b c El primer archivo legible en orden de ~ / .bash_profile , ~ / .bash_login y ~ / .profile ; y solo ~ / .profile si se invoca como sh o, a partir de al menos Bash 4.2, si se invoca explícitamente en el modo de compatibilidad POSIX (con opciones --posix o -o posix )
Otras conchas
Las variaciones del concepto de shell de Unix que no se derivan del shell de Bourne o del shell de C incluyen las siguientes: [15]
- es - Un shell de programación funcional compatible con rc escrito a mediados de la década de 1990.
- Concha interactiva amigable (pescado): lanzado por primera vez en 2005.
- PowerShell : un shell orientado a objetos desarrollado originalmente para el sistema operativo Windows y ahora disponible para macOS y Linux.
- Qshell : un shell del sistema operativo IBM i basado en los estándares POSIX y X / Open .
- rc : el shell predeterminado en Plan 9 de Bell Labs y Versión 10 Unix escrito por Tom Duff . Se han realizado puertos a varios sistemas operativos similares a Unix.
- scsh : un shell de esquema .
- deseo : un shell de ventanas para Tcl / Tk .
Ver también
- Comparación de proyectiles de comando
- Lista de comandos de Unix
- Bucle de lectura-evaluación-impresión
- Concha restringida
- Shell (informática)
- Cuenta Shell
- Script de shell
- Palear conchas
Referencias
- ↑ a b Tom Van Vleck (5 de febrero de 1995). "Unix y Multics" . Multicians.org . Consultado el 14 de agosto de 2012 .
- ^ Bourne, Stephen R. (octubre de 1983). "El Unix Shell" . BYTE . pag. 187 . Consultado el 30 de enero de 2015 .
- ^ "Puerto V6 Thompson Shell - Historia" . V6shell.org . Consultado el 14 de agosto de 2012 .
- ^ Louis Pouzin (25 de noviembre de 2000). "El origen de la concha" . Multicians.org . Consultado el 14 de agosto de 2012 .
- ^ Nikolai Bezroukov ( 13 de agosto de 2015 ). "Introducción a la historia del shell de Unix" . Softpanorama . Consultado el 21 de agosto de 2016 .
- ^ "Concha de Bourne, o sh" . Entrevista a Steve Bourne . Computerworld . 2009-03-05 . Consultado el 21 de agosto de 2016 .
- ^ " Re: tarde Bloomers revisited " . Consultado el 20 de septiembre de 2014 .
- ^ Korn, David G. (26 de octubre de 1994), "ksh - An Extensible High Level Language" , Proceedings of the USENIX 1994 Very High Level Languages Symposium , USENIX Association , recuperado el 5 de febrero de 2015 , en
lugar de inventar un nuevo lenguaje de escritura, Creamos un sistema de entrada de formularios modificando el shell Bourne, agregando comandos incorporados según sea necesario.
- ^ Harley Hahn, Guía de Harley Hahn para Unix y Linux .
- ^ "Cáscara de Hamilton C para Windows Release Notes 4.0" . Consultado el 20 de septiembre de 2014 .
- ^ "Diferentes shells UNIX" . unixnote.com. 2010 . Consultado el 21 de agosto de 2016 .
- ^ SCO Unix Group, documentación de SCO Unixware 7, 22 de abril de 2004, consultado el 18 de octubre de 2012 .
- ^ "Lenguaje de comandos de Shell" . opengroup.org . Consultado el 15 de junio de 2015 .
- ^ "Manual de referencia de Bash: archivos de inicio de Bash" . gnu.org . Consultado el 15 de junio de 2015 .
- ^ "Puertos FreeBSD: Shells" . Freebsd.org. 2014-03-30 . Consultado el 5 de abril de 2014 .