Articulo de referencia

shell de Unix

Ventanas de shell tcsh y sh en un escritorio Mac OS X Leopard [ 1 ] Un intérprete de comandos Unix es un intérprete que proporciona una interfaz de línea de comandos para un sis...

Ventanas de shell tcsh y sh en un escritorio Mac OS X Leopard [ 1 ]

Un intérprete de comandos Unix es un intérprete que proporciona una interfaz de línea de comandos para un sistema operativo tipo Unix . Un intérprete de comandos Unix proporciona un lenguaje de comandos que se puede usar de forma interactiva o para escribir un script de shell . [ 2 ] Un usuario normalmente trabaja dentro de un intérprete de comandos Unix a través de un emulador de terminal ; sin embargo, el acceso directo a través de conexiones de hardware serie o un Secure Shell es común en sistemas de servidor. Aunque el uso de un intérprete de comandos Unix es popular entre algunos usuarios, otros prefieren usar un intérprete gráfico en un sistema de ventanas , como los que se proporcionan en las distribuciones de Linux de escritorio o macOS , en lugar de una interfaz de línea de comandos (CLI).

Un usuario puede tener acceso a varias shells de Unix, una de las cuales se configura para ejecutarse por defecto al iniciar sesión de forma interactiva. Esta selección predeterminada suele almacenarse en el perfil del usuario (por ejemplo, en el archivo passwd local o en un sistema de configuración distribuido como NIS o LDAP ). El usuario puede utilizar otras shells anidadas dentro de la shell predeterminada.

Un intérprete de comandos de Unix puede proporcionar muchas características, entre ellas: definición y sustitución de variables , sustitución de comandos , comodines en nombres de archivo , canalización de flujo , estructuras de flujo de control ( pruebas de condición e iteración ), contexto de directorio de trabajo y documento here .

Historia

Conchas primitivas

El primer intérprete de comandos de Unix fue el intérprete de comandos 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 intérpretes de comandos de Unix posteriores, incluyendo tuberías, estructuras de control simples usando ify , y el GLOBgoto de nombres de archivo.bing. Aunque no se usa actualmente, todavía está disponible como parte de algunos sistemas UNIX antiguos , como la versión 6 de Unix .

Se basó en el intérprete de comandos Multics , desarrollado en 1965 por la ingeniera de software estadounidense Glenda Schroeder . El intérprete Multics de Schroeder, a su vez, se basó en el programa RUNCOM que Louis Pouzin mostró al equipo de Multics. El sufijo "rc" en algunos archivos de configuración de Unix (por ejemplo, ".bashrc" o ".vimrc") es un vestigio de la herencia RUNCOM de los intérpretes de comandos de Unix. [ 1 ] [ 4 ]

El intérprete de comandos PWB o Mashey, sh , era una versión compatible con versiones anteriores del intérprete de comandos Thompson, ampliada por John Mashey y otros, y distribuida con Programmer's Workbench UNIX , entre 1975 y 1977. Su objetivo era hacer que la programación de shell fuera práctica, especialmente en grandes centros de computación compartida. Añadió variables de shell (precursoras de las variables de entorno , incluyendo 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 popularizó, estos comandos externos se incorporaron al propio intérprete para mejorar el rendimiento.

Pero los shells de Unix más extendidos e influyentes de los primeros tiempos 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 ]

Bourne shell

El intérprete de comandos Bourne , sh , fue un nuevo intérprete de comandos de Unix creado por Stephen Bourne en Bell Labs. [ 6 ] Distribuido como intérprete de comandos para UNIX versión 7 en 1979, introdujo el resto de las características básicas consideradas comunes a todos los intérpretes de comandos de Unix posteriores, incluyendo documentos aquí , sustitución de comandos , variables más genéricas y estructuras de control integradas más extensas . El lenguaje, incluyendo el uso de una palabra clave invertida para marcar el final de un bloque, estuvo influenciado por ALGOL 68. [ 7 ] Tradicionalmente , el nombre del programa del intérprete de comandos Bourne es sh y su ruta en la jerarquía del sistema de archivos de Unix es /bin/sh . Pero también hay disponibles varias alternativas compatibles con diversas 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:

  • Shell de Almquist (ash): escrita como una alternativa con licencia BSD al shell de Bourne; se usa frecuentemente en entornos con recursos limitados. El shell sh de FreeBSD , NetBSD (y sus derivados) se basa en ash, que ha sido mejorado para cumplir con el estándar POSIX .
    • Busybox : un conjunto de utilidades Unix para sistemas pequeños y embebidos, que incluye dos intérpretes de comandos: ash, una derivación del intérprete de comandos Almquist; y hush, una implementación independiente del intérprete de comandos Bourne.
    • Shell Debian Almquist (dash): un reemplazo moderno para ash en Debian y Ubuntu.
  • Bourne-Again shell (bash): desarrollado como parte del Proyecto GNU para ofrecer un conjunto de funcionalidades superior al de Bourne Shell. Este intérprete de comandos viene instalado y es el intérprete interactivo predeterminado para la mayoría de los sistemas Linux ; ofrece tanto el modo interactivo (implementado por GNU Readline) como el modo script.
  • Korn shell (ksh): una versión mejorada del Bourne shell, escrita por David Korn basándose en las fuentes del Bourne shell [ 8 ] mientras trabajaba en Bell Labs.
  • Shell Korn de dominio público (pdksh)
  • Z shell (zsh): un intérprete de comandos relativamente moderno que es parcialmente compatible con versiones anteriores de bash . Es el intérprete de comandos predeterminado en Kali Linux desde la versión 2020.4 y en macOS desde la versión 10.15 Catalina .

El estándar POSIX especifica su shell estándar como un subconjunto estricto del shell Korn. Desde la perspectiva del usuario, el shell Bourne se reconocía inmediatamente cuando estaba activo por su característico carácter predeterminado en el indicador de línea de comandos, el signo de dólar ( $ ).

C shell

El intérprete de comandos C , csh , se basó en el lenguaje de programación C , incluyendo las estructuras de control y la gramática de expresiones. Fue escrito por Bill Joy como estudiante de posgrado en la Universidad de California, Berkeley , y se distribuyó ampliamente con BSD Unix . [ 9 ]

El intérprete de comandos C también introdujo muchas características para el trabajo interactivo, incluyendo 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 intérprete de comandos 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 intérpretes de comandos, la estructura del lenguaje no se ha copiado ampliamente. El único intérprete de comandos similar es Hamilton C shell , escrito por Nicole Hamilton, distribuido por primera vez en OS/2 en 1988 y en Windows desde 1992. [ 10 ]

Archivos de configuración

Los intérpretes de comandos leen archivos de configuración en diversas circunstancias. Estos archivos suelen contener comandos para el intérprete y se ejecutan al cargarse; normalmente se utilizan para establecer variables importantes que se usan para encontrar ejecutables, como $PATH , y otras que controlan el comportamiento y la apariencia del intérprete. La tabla de esta sección muestra los archivos de configuración de los intérpretes de comandos más populares. [ 11 ]

Explicación:

  • "Blanco" significa que el intérprete de comandos no lee el archivo en absoluto.
  • "sí" significa que un shell siempre lee un archivo al iniciarse.
  • "login" significa que se lee un archivo si el intérprete de comandos es un intérprete de comandos de inicio de sesión.
  • "n/login" significa que se lee un archivo si el intérprete de comandos no es un intérprete de comandos de inicio de sesión.
  • "int." significa que se está leyendo un archivo si el intérprete de comandos es interactivo.
  1. solo sino se encuentra ~/.tcshrc
  2. Versiones más recientes de Bourne Shell solamente
  3. Disponible en sistemas que admiten la opción "Utilidades de portabilidad del usuario"; el valor de la variable debe ser una ruta 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 ]
  4. $ENV es $HOME/.shrc en versiones más recientes de Bourne Shell
  5. 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 modo de compatibilidad POSIX (con las opciones --posix o -o posix ). [ 14 ]
  6. 1 2 Solo en modo de compatibilidad sh/ksh (cuando se invoca como bash, sh, ksh)
  7. 1 2 3 El primer archivo legible en orden de ~/.bash_profile , ~/.bash_login y ~/.profile ; y solo ~/.profile si se invoca como sh o, al menos desde Bash 4.2, si se invoca explícitamente en modo de compatibilidad POSIX (con las opciones --posix o -o posix )

Otras conchas

Las variaciones del concepto de shell de Unix que no derivan del shell Bourne o del shell C incluyen las siguientes: [ 15 ]

Véase también

Referencias

  1. 1 2 Tom Van Vleck (1995-02-05). "Unix y Multics" . Multicians.org . Recuperado el 2012-08-14 .
  2. Bourne, Stephen R. (octubre de 1983). "The Unix Shell" . BYTE . pág. 187. Consultado el 28 de junio de 2026 . 
  3. "V6 Thompson Shell Port - Historia" . V6shell.org . Consultado el 14 de agosto de 2012 .
  4. Louis Pouzin (25 de noviembre de 2000). "El origen de la concha" . Multicians.org . Consultado el 14 de agosto de 2012 .
  5. Nikolai Bezroukov (13 de agosto de 2015). "Introducción a la historia del shell de Unix" . Softpanorama. Archivado del original el 8 de junio de 2022. Consultado el 21 de agosto de 2016 .
  6. Bourne, Stephen (5 de marzo de 2009). "El AZ de los lenguajes de programación: Bourne shell, o sh" (Entrevista). Entrevistado por Howard Dahdah. Computerworld . Archivado del original el 16 de agosto de 2022. Consultado el 16 de agosto de 2022 .
  7. " Re: Revisitando a los que florecen tarde " . Consultado el 20 de septiembre de 2014 .
  8. Korn, David G. (26 de octubre de 1994), "ksh - Un lenguaje de alto nivel extensible" , Actas del Simposio de Lenguajes de Muy Alto Nivel USENIX 1994 , Asociación USENIX , consultado el 5 de febrero de 2015 , En lugar de inventar un nuevo lenguaje de script, construimos un sistema de entrada de formularios modificando el shell Bourne, agregando comandos integrados según fuera necesario.
  9. Harley Hahn. "Cronología de Unix/Linux" . Guía de Harley Hahn sobre Unix y Linux .
  10. "Notas de la versión 4.0 de Hamilton C shell para Windows" . Consultado el 20 de septiembre de 2014 .
  11. "Diferentes shells de UNIX" . unixnote.com. 2010. Archivado del original el 3 de abril de 2016. Consultado el 21 de agosto de 2016 .
  12. Harley Hahn. "Ejercicios y respuestas del capítulo 14... Uso del intérprete de comandos: archivos de inicialización" . Guía de Harley Hahn para Unix y Linux .
  13. "Lenguaje de comandos de shell" . opengroup.org . Consultado el 15 de junio de 2015 .
  14. "Manual de referencia de Bash: Archivos de inicio de Bash" . gnu.org . Consultado el 15 de junio de 2015 .
  15. "Puertos de FreeBSD: Shells" . Freebsd.org. 30 de marzo de 2014. Archivado del original el 12 de enero de 2021. Consultado el 5 de abril de 2014 .