Concha de Unix

Intérprete de línea de comandos para el sistema operativo Unix
Ventanas de shell tcsh y sh en un escritorio Mac OS X Leopard [1]

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 .

Concepto

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 .

Conchas tempranas

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 ify gotoy 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 con 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 búsqueda de ruta 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 con 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]

Concha Bourne

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 ( $ ).

C-shell (concha C)

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]

Archivos de configuración

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ónellakshcshTcsh-español:Tcsh-español:intentozsh
/etc/.loginaccesoacceso
/etc/csh.cshrc
/etc/csh.loginaccesoacceso
~/.tcshrc
~/.cshrc[a]
/etc/ksh.kshrcen t.
/etc/sh.shrcint. [b]
$ENV (normalmente ~/.kshrc ) [12]int. [c] [d]en t.int. [e]
~/.inicio de sesiónaccesoacceso
~/.cerrar sesiónaccesoacceso
/etc/perfilaccesoaccesoaccesoiniciar sesión [f]
~/.perfilaccesoaccesoiniciar sesión [g]iniciar sesión [f]
~/.bash_perfiliniciar sesión [g]
~/.bash_logininiciar sesión [g]
~/.bash_cerrar sesiónacceso
~/.bashrcint.+n/inicio de sesión
/etc/zshenv
/etc/perfilzacceso
/etc/zshrcen t.
/etc/zloginacceso
/etc/zcerrar sesiónacceso
~/.zshenv
~/.zperfilacceso
~/.zshrcen t.
~/.zloginacceso
~/.zcerrar sesiónacceso

Explicación:

  • En blanco significa que un shell no lee ningún archivo.
  • "Sí" significa que un archivo siempre es leído por un shell 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 el shell es interactivo.
  1. ^ solo si no se encuentra ~/.tcshrc
  2. ^ Solo versiones más nuevas de Bourne Shell
  3. ^ Disponible en sistemas que admiten la opción "Utilidades de portabilidad de usuario"; el valor de la variable debe ser una ruta absoluta y se ignora "si los identificadores de usuario reales y efectivos o los identificadores de grupo reales y efectivos del usuario son diferentes". [13]
  4. ^ $ENV es $HOME/.shrc en versiones más nuevas de Bourne Shell
  5. ^ El mismo comportamiento que sh , pero sólo 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. ^ ab Solo en modo de compatibilidad sh/ksh (cuando se invoca como bash, sh, ksh)
  7. ^ abc El primer archivo legible en orden ~/.bash_profile , ~/.bash_login y ~/.profile ; y solo ~/.profile si se invoca como sh o, al menos a partir de 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 se derivan de Bourne shell o C shell incluyen las siguientes: [15]

Véase también

Referencias

  1. ^ por Tom Van Vleck (5 de febrero de 1995). "Unix y Multics". Multicians.org . Consultado el 14 de agosto de 2012 .
  2. ^ Bourne, Stephen R. (octubre de 1983). "The Unix Shell". BYTE . p. 187 . Consultado el 30 de enero de 2015 .
  3. ^ "V6 Thompson Shell Port - History" (Puerto V6 Thompson Shell: 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 desde el original el 8 de junio de 2022. Consultado el 21 de agosto de 2016 .
  6. ^ Bourne, Stephen (5 de marzo de 2009). "La A a la Z de los lenguajes de programación: Bourne shell o sh" (Entrevista). Entrevista realizada por Howard Dahdah. Computerworld . Consultado el 16 de agosto de 2022 .
  7. ^ "Re: Late Bloomers Revisited" (Revisión de los que florecen tardíamente) . Consultado el 20 de septiembre de 2014 .
  8. ^ Korn, David G. (26 de octubre de 1994), "ksh - Un lenguaje extensible de alto nivel", Actas del Simposio de lenguajes de muy alto nivel de USENIX de 1994 , Asociación USENIX , consultado el 5 de febrero de 2015. 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.
  9. ^ Harley Hahn, Guía de Harley Hahn para Unix y Linux: Cronología de Unix/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 desde el original el 3 de abril de 2016. Consultado el 21 de agosto de 2016 .
  12. ^ SCO Unix Group, documentación de SCO Unixware 7, 22 de abril de 2004, consultado el 18 de octubre de 2012.
  13. ^ "Lenguaje de comandos de Shell". opengroup.org . Consultado el 15 de junio de 2015 .
  14. ^ "Bash Reference Manual: Bash Startup Files" (Manual de referencia de Bash: archivos de inicio de Bash). gnu.org . Consultado el 15 de junio de 2015 .
  15. ^ "FreeBSD Ports: Shells". Freebsd.org. 2014-03-30. Archivado desde el original el 2021-01-12 . Consultado el 2014-04-05 .
Obtenido de "https://es.wikipedia.org/w/index.php?title=Unix_shell&oldid=1236896844"