Cáscara de Unix
Un shell 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 un lenguaje de comando interactivo y un lenguaje de secuencias de comandos, y el sistema operativo lo utiliza para controlar la ejecución del sistema mediante scripts de shell.
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 son comunes para los sistemas de servidor. Todos los shells de Unix proporcionan comodines de nombre de archivo, tuberías, documentos aquí, sustitución de comandos, variables y estructuras de control para pruebas de condición e iteración.
Concepto
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 al pasar variables con nombre, una lista de parámetros o una fuente de entrada.
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 se puede personalizar para cada usuario, normalmente se almacena en el perfil del usuario, por ejemplo, en el archivo local passwd 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 los sistemas operativos con un sistema de ventanas, como macOS y las distribuciones de escritorio de Linux, 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.
Primeras conchas
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. Aunque rudimentario según los estándares modernos, introdujo muchas de las características básicas comunes a todos los shells posteriores de Unix, incluyendo tuberías, estructuras de control simples usando if
y goto
, y comodines de nombre de archivo. Aunque no se usa 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. El caparazón Multics de Schroeder se modeló a partir del programa RUNCOM que Louis Pouzin mostró al equipo Multics. El "rc" El sufijo en algunos archivos de configuración de Unix (por ejemplo, ".vimrc"), es un remanente de la ascendencia RUNCOM de los shells de Unix.
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 shell, especialmente en grandes centros informáticos compartidos. Agregó variables de shell (precursores de 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 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 los shells Bourne y C. Ambos shells se han utilizado como base de codificación y modelo para muchos shells derivados y similares con conjuntos de funciones ampliadas.
Concha de Bourne
El shell Bourne, sh, era un nuevo shell de Unix creado por Stephen Bourne en Bell Labs. 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 aquí 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. Tradicionalmente, el nombre del programa shell de Bourne es sh y su ruta en el La jerarquía del sistema de archivos de Unix es /bin/sh. Pero también hay disponibles varios similares compatibles con varias mejoras y características adicionales. En muchos sistemas, sh puede ser un enlace simbólico o un enlace fijo a una de estas alternativas:
- Almquist shell (ash): written as a BSD-licensed replace for the Bourne Shell; often used in resource-constrained environments. El sh of FreeBSD, NetBSD (y sus derivados) se basan en cenizas que se han mejorado para ser conformantes POSIX.
- Busybox: un conjunto de utilidades Unix para sistemas pequeños e incrustados, que incluye 2 conchas: ceniza, un derivado de la cáscara Almquist; y silencio, una implementación independiente de una cáscara Bourne.
- Carcasa Almquist de Debian (dash): un reemplazo moderno para cenizas en Debian y Ubuntu
- Bourne-Again shell (bash): escrito como parte del Proyecto GNU para proporcionar un superset de 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 de la cáscara de Bourne mientras trabajaba en Bell Labs
- Dominio público Korn shell (pdksh)
- MirBSD Carcasa de Korn (mksh): descendiente del OpenBSD /bin/ksh y pdksh, desarrollado como parte de MirOS BSD
- Z shell (zsh): un shell relativamente moderno que es compatible con bash. Es la shell predeterminada 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 del usuario, el Bourne Shell se reconoció inmediatamente cuando estaba activo por su característico carácter predeterminado de la línea de comandos, el signo de dólar ($).
Concha C
El shell C, csh, fue modelado en el lenguaje de programación C, incluidas las estructuras de control y la gramática de expresión. Fue escrito por Bill Joy como estudiante de posgrado en la Universidad de California, Berkeley, y se distribuyó ampliamente con BSD Unix.
El shell C también introdujo muchas funciones 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 hashing de rutas. En muchos sistemas, csh puede ser un enlace simbólico o un enlace fijo a TENEX C shell (tcsh), una versión mejorada de la versión original de Joy. Aunque las funciones interactivas de csh se han copiado en la mayoría de los otros shells, la estructura del lenguaje no se ha copiado mucho. El único que funciona igual es Hamilton C shell, escrito por Nicole Hamilton, distribuido por primera vez en OS/2 en 1988 y en Windows desde 1992.
Archivos de configuración
Los shells leen los archivos de configuración en varias 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 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 shells populares.
Archivo de configuración | # | ksh | csh | Tcsh | Bash | Zsh |
---|---|---|---|---|---|---|
/etc/.login | login | login | ||||
/etc/csh.cshrc | Sí. | Sí. | ||||
/etc/csh.login | login | login | ||||
~/.tcshrc | Sí. | |||||
~/.cshrc | Sí. | Sí. | ||||
~/etc/ksh.kshrc | Int. | |||||
/etc/sh.shrc | Int. | |||||
$ENV (típicamente) ~/.kshrc) | Int. | Int. | Int. | |||
~/.login | login | login | ||||
~/.logout | login | login | ||||
/etc/profile | login | login | login | login | ||
~/.profile | login | login | login | login | ||
~/.bash_profile | login | |||||
~/.bash_login | login | |||||
~/.bash_logout | login | |||||
~/.bashrc | int.+n/login | |||||
/etc/zshenv | Sí. | |||||
/etc/zprofile | login | |||||
/etc/zshrc | Int. | |||||
/etc/zlogin | login | |||||
/etc/zlogout | login | |||||
~/.zshenv | Sí. | |||||
~/.zprofile | login | |||||
~/.zshrc | Int. | |||||
~/.zlogin | login |
Explicación:
- en blanco significa que un archivo no es leído por un shell en absoluto.
- "sí" significa que un archivo siempre es leído por una cáscara al iniciarse.
- "login" 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.
- "int." significa que se lee un archivo si la concha es interactiva.
- ^ sólo si ~/.tcshrc no encontrado
- ^ Nuevas versiones de Bourne Shell sólo
- ^ Disponible en sistemas que soportan la opción "User Portability Utilities"; el valor de la variable debe ser un absoluto path, y se ignora "si los IDs de usuario reales y eficaces del usuario o los IDs de grupo reales y eficaces son diferentes".
- ^ $ENV es $HOME/.shrc en versiones más recientes del Bourne Shell
- ^ Mismo comportamiento #, pero sólo si se invoca # (bash 2+) o, desde bash 4.2, también si se invoca explícitamente en modo de compatibilidad POSIX (con opciones --posix o -o posix).
- ^ a b Sólo en modo de compatibilidad sh/ksh (cuando se invoca como bash, sh, ksh)
- ^ a b c El primer archivo legible en orden ~/.bash_profile, ~/.bash_login y ~/.profile; y solamente ~/.profile si se invoca como # o, al menos Bash 4.2, si se invoca explícitamente en 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 Bourne o del shell C incluyen las siguientes:
- es – Un cáscara compatible de programación funcional rc escrito a mediados de los años 90.
- Cácara interactiva amistosa (pescado) – Primera publicación en 2005.
- PowerShell – Una cáscara orientada al objeto desarrollada originalmente para Windows OS y ahora disponible para macOS y Linux.
- Qshell – Un shell en el sistema operativo IBM i basado en estándares POSIX y X/Open.
- rc – La cáscara predeterminada del Plan 9 de Bell Labs y la versión 10 Unix escrita por Tom Duff. Se han hecho puertos a varios sistemas operativos similares a Unix.
- scsh – Un esquema Shell.
- deseo – Una cáscara de ventana para Tcl/Tk.
Contenido relacionado
Algoritmo de búsqueda
Televisión por cable
Tienda de control