El shell Bourne ( sh
) es un intérprete de línea de comandos de shell para sistemas operativos de computadora .
El shell Bourne era el shell predeterminado para la versión 7 de Unix . Los sistemas tipo Unix siguen teniendo /bin/sh
—que será el shell Bourne, o un enlace simbólico o un enlace duro a un shell compatible— incluso cuando la mayoría de los usuarios utilizan otros shells.
Desarrollado por Stephen Bourne en Bell Labs , fue un reemplazo del shell Thompson , cuyo archivo ejecutable tenía el mismo nombre sh
. Fue lanzado en 1979 en la versión 7 de Unix distribuida a colegios y universidades. Aunque se utiliza como un intérprete de comandos interactivo, también fue pensado como un lenguaje de script y contiene la mayoría de las características que comúnmente se consideran para producir programas estructurados.
Ganó popularidad con la publicación de The Unix Programming Environment de Brian Kernighan y Rob Pike , el primer libro publicado comercialmente que presentó el shell como un lenguaje de programación en forma de tutorial.
El trabajo en el shell Bourne comenzó inicialmente en 1976. [1] Apareciendo por primera vez en la versión 7 de Unix , [2] el shell Bourne fue precedido por el shell Mashey .
Algunos de los objetivos principales del shell eran: [3]
Las características del shell Bourne de UNIX versión 7 incluyen:
`command`
.<<
para incrustar un bloque de texto de entrada dentro de un script.for ~ do ~ done
bucles, en particular el uso de $*
para iterar sobre argumentos, así como for ~ in ~ do ~ done
bucles para iterar sobre listas.case ~ in ~ esac
mecanismo de selección, destinado principalmente a ayudar en el análisis de argumentos .sh
Proporcionó soporte para variables de entorno utilizando parámetros de palabras clave y variables exportables.El shell Bourne también fue el primero en presentar la convención de usar descriptores de archivos 2>
para mensajes de error , lo que permitió un control programático mucho mayor durante la creación de scripts al mantener los mensajes de error separados de los datos.
El estilo de codificación de Stephen Bourne estuvo influenciado por su experiencia con el compilador ALGOL 68C [2] en el que había estado trabajando en la Universidad de Cambridge . Además del estilo en el que se escribió el programa, Bourne reutilizó partes de las cláusulas , y " (usando en lugar de ) de ALGOL 68 en la sintaxis común del shell Bourne de Unix . Además, – aunque el shell v7 está escrito en C – Bourne aprovechó algunas macros [4] para darle al código fuente de C un sabor a ALGOL 68. Estas macros (junto con el comando finger distribuido en la versión 4.2BSD de Unix ) inspiraron el Concurso Internacional de Código C Ofuscado (IOCCC). [5]if ~ then ~ elif ~ then ~ else ~ fi
case ~ in ~ esac
for/while ~ do ~ od
done
od
Con el paso de los años, AT&T mejoró el shell Bourne. Las distintas variantes reciben el nombre de la versión Unix de AT&T con la que se lanzó (algunas variantes importantes son Version7, System III, SVR2, SVR3 y SVR4). Como el shell nunca tuvo versiones, la única forma de identificarlo era probando sus características. [6]
Las características de las versiones de Bourne Shell desde 1979 incluyen: [7]
test
: shell del Sistema III (1981)continue
con argumento – Shell del Sistema III (1981)cat <<-EOF
Para los documentos que aparecen aquí sangrados – Shell del Sistema III (1981)return
shell incorporado – SVR2 (1984)unset
, echo
, type
– Carcasa SVR2 (1984)$@
" – SVR3 (1986)getopts
: carcasa SVR3 (1986)Duplex Multi-Environment Real-Time ( DMERT ) es un sistema operativo híbrido de tiempo compartido/tiempo real desarrollado en la década de 1970 en la sede de Bell Labs en Indian Hill, Naperville, Illinois, que utiliza una instantánea de Bourne Shell de 1978 "VERSION sys137 DATE 1978 Oct 12 22:39:57". [ cita requerida ] El shell DMERT se ejecuta en computadoras 3B21D que aún se utilizan en la industria de las telecomunicaciones. [ cita requerida ]
El shell Korn (ksh), escrito por David Korn basándose en el código fuente original del Bourne Shell, [8] era un camino intermedio entre el Bourne Shell y el C Shell . Su sintaxis se extrajo principalmente del Bourne Shell, mientras que sus características de control de tareas se parecían a las del C Shell. La funcionalidad del Korn Shell original (conocido como ksh88 desde el año de su introducción) se utilizó como base para el estándar de shell POSIX . Una versión más nueva, ksh93, ha sido de código abierto desde 2000 y se utiliza en algunas distribuciones de Linux . Un clon de ksh88 conocido como pdksh es el shell predeterminado en OpenBSD.
Schily-Tools de Jörg Schilling incluye tres derivados de Bourne Shell. [9]
Bill Joy , el autor del C shell , criticó al Bourne shell por ser poco amigable para el uso interactivo, [10] una tarea para la cual el propio Stephen Bourne reconoció la superioridad del C shell. Bourne afirmó, sin embargo, que su shell era superior para la creación de scripts y estaba disponible en cualquier sistema Unix, [11] y Tom Christiansen también criticó al C shell por ser inadecuado para la creación de scripts y la programación. [12]
Debido a problemas de derechos de autor relacionados con Bourne Shell, tal como se utilizó en versiones históricas de CSRG BSD, Kenneth Almquist desarrolló un clon de Bourne Shell, conocido por algunos como Almquist Shell y disponible bajo la licencia BSD , que se utiliza hoy en día en algunos descendientes de BSD y en situaciones de poca memoria. Almquist Shell se trasladó a Linux y el puerto se renombró Debian Almquist Shell o dash. Este shell proporciona una ejecución más rápida de scripts estándar sh
(y POSIX-standard sh
, en descendientes modernos) con una huella de memoria más pequeña que su contraparte, Bash. Su uso tiende a exponer bashismos : suposiciones centradas en bash realizadas en scripts destinados a ejecutarse en sh.
El shell Bourne fue en su día el estándar en todos los sistemas Unix de marca , aunque históricamente los sistemas basados en BSD tenían muchos scripts escritos en csh . Como base de la sintaxis POSIX sh
, los scripts del shell Bourne normalmente se pueden ejecutar con Bash o dash en Linux u otros sistemas similares a Unix .
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.