El proyectil Bash tiene más de 30 años y sigue siendo fuerte. ¿Qué hace, de dónde vino y por qué sigue siendo el shell más común en los sistemas Linux?
¿De qué vamos a hablar?
¿Qué es un Shell?
Cuando abres una ventana de terminal y escribes comandos, algo tiene que tomar lo que has escrito, averiguar lo que pretendías y ejecutar las tareas que solicitaste. El software que hace esto es el shell. Un shell es un intérprete de comandos. Escanea lo que ha escrito y selecciona los comandos, nombres de directorio, nombres de archivo y nombres de programas para que pueda descubrir lo que está tratando de lograr.
La gente a menudo usa las frases “ventanas de terminal”, “línea de comandos” y “shell” indistintamente, pero son tres cosas distintas. Una ventana de terminal es una representación de software de un terminal de teletipo físico. Le da una conexión a la computadora. Para hacer algo útil, debe poder escribir instrucciones en una línea de comandos. La línea de comandos es proporcionada por el shell, y la ventana de terminal le permite acceder al shell.
Los shells también le permiten parcelar una colección de comandos en un archivo de texto llamado script. Todos los comandos del script se ejecutan cada vez que ejecuta el script. Los scripts ofrecen eficiencia, repetibilidad y conveniencia.
El primer shell de Unix fue el Concha Thompsonllamado sh
. Fue escrito por Ken Thompson, que es posiblemente el miembro más clave de los padres fundadores originales de Unix en Laboratorios Bell. El shell Thompson se utilizó como el shell predeterminado de Unix hasta e incluyendo Unix Versión 6. Fue reemplazado por el Concha de Bourne en la versión 7 de Unix en 1979.
La concha de Bourne
La concha de Bourne, escrita por Esteban Bourne, fue un reemplazo mejorado para el proyectil Thompson. Incluso se comenzó a usar el mismo comando que el proyectil Thompson, sh
, para mantener la compatibilidad con versiones anteriores de los scripts existentes. La compatibilidad con versiones anteriores era importante, pero se incluyeron nuevas características que proporcionaron mucha funcionalidad que todavía usamos hoy en día.
El shell de Bourne era un shell interactivo y un lenguaje de scripting. Admitía la ejecución de tareas en primer plano y en segundo plano y el control elemental de trabajos. Se agregaron tuberías y redirecciones, junto con mejoras en los bucles de manejo.
El shell ahora contenía algunos comandos incorporados, lo que significa que no necesitaba pasar todo a utilidades externas, lo que lo hacía más eficiente. El shell de Bourne incluso admitía “aquí documentos”, una forma elegante de automatizar el envío de datos en comandos.
El proyectil Bourne elevó el listón y se convirtió en el nuevo estándar.
El nacimiento de Bash
En 1984, cuando el Proyecto GNU anunció su intención de hacer un clon gratuito de Unix, escrito desde cero y con un licencias nuevas y permisivas—el equipo necesitaba un caparazón. Cuando un voluntario que había estado trabajando en un shell para el proyecto GNU repetidamente no pudo entregar nada en absoluto, Brian Fox se le encomendó la tarea de escribir un clon de la concha de Bourne.
Fue apodado el Bourne Again Shell, o Bash. Esto fue en parte en homenaje a Stephen Bourne y en parte un juego de palabras por el bien de ello. Después de su lanzamiento en 1989, Chet Ramey contribuyó con algunas correcciones de errores a Bash. Eventualmente se convirtió en co-mantenedor del shell Bash. Hoy en día, sigue siendo el mantenedor del proyecto Bash.
Linus Torvalds, el creador del kernel de Linux, ha dicho que los dos primeros programas que ejecutó en su nuevo kernel en 1991 fueron Bash y gcc
, Compilador de GNU. El emparejamiento de las utilidades gnu con el kernel de Linux fue mutuamente beneficioso. El sistema operativo GNU necesitaba un núcleo, y el kernel Linux necesitaba todo lo demás que compone un clon de Unix.
Debido a que Bash es el shell estándar de GNU, se convirtió en el shell estándar en todas las distribuciones de GNU/Linux. Linux floreció hasta el punto de que ahora sustenta una cantidad asombrosa del mundo moderno. El shell Bash también surfeó esa ola de éxito.
Bash incorpora y mejora el conjunto de características de la concha Bourne, pero también se inspiró en otras conchas, como la Concha C (csh
) y el KornShell (ksh
). Por ejemplo, la expansión de la tilde “~
” al valor mantenido en el €HOME
la variable de entorno proviene del shell C y el fc
command que invoca el editor predeterminado en los comandos del historial de comandos proviene de KornShell.
Bash introdujo archivos de configuración como los archivos “.bashrc” y “.bash_profile”. La edición de línea de comandos en Bash superó con creces las capacidades de los shells anteriores. La manipulación de comandos ejecutados previamente en el historial de comandos fue una versión mejorada de la función “bang history” de los shells C. La expansión brace era una característica que faltaba en el shell de Bourne que se implementó en Bash como un superconjunto de la funcionalidad que se encuentra en el shell de C. Las matrices se mejoraron eliminando sus límites de tamaño. La expansión de parámetros en el símbolo del sistema permite a los usuarios personalizar su símbolo del sistema Bash.
El shell Bash tiene como objetivo cumplir con el POSIX P1003.2/ISO 9945.2 Shell y utilidades estándar.
Por qué Bash sigue siendo importante
Bash no podría haber durado tanto tiempo, más de 30 años, como el shell predeterminado de Linux si no estuviera a la altura del trabajo. Debido a su larga vida útil y su enorme base de usuarios, Bash es maduro y muy estable. Hay muchos proyectiles alternativos disponibles, desde veteranos como el proyectil C y el KornShell hasta proyectiles más nuevos como el proyectil Z (zsh
) y el Shell interactivo amigable (fish
). Tanto la concha Z como la concha Fish tienen algunas características que Bash no tiene tan bien como posiblemente mejores formas de lograr algunas de las mismas cosas que Bash hace. Entonces, ¿por qué Bash sigue siendo la cáscara dominante?
De todas las máquinas Linux que se me ha pedido que administre, no recuerdo una sola que no tuviera Bash como shell. Máquinas Unix, sí, pero cajas Linux, no. Es Bash cada vez. Esa familiaridad le permite ponerse a trabajar rápidamente y ser efectivo de inmediato. Ya conoces Bash, así que no hay curva de aprendizaje. No te quedas paralizado por pequeñas diferencias en la sintaxis que te hacen dar vueltas en círculos tratando de averiguar por qué algo no funciona. Tiempo dedicado a averiguar en qué debería estar el conjuro éste Shell es tiempo muerto, por lo que es en interés del negocio del cliente utilizar un shell bien conocido y ampliamente utilizado.
El uso de un shell que es, o está tratando de ser, compatible con POSIX es importante para muchas distribuciones de Linux, pero lo que importa más es la compatibilidad con versiones anteriores. Hacer cambios que podrían romper los scripts existentes es obviamente poco atractivo. Atractivo o no, a veces, solo hay que morder la bala. El 3 de septiembre de 1967, Suecia pasó de conducir por la izquierda a conducir por la derecha. A las 4:50 a.m., todo el tráfico tuvo que detenerse, lentamente se dirigió al otro lado de la carretera y detenerse una vez más. A las 5:00 a.m., el tráfico podía continuar, con todos conduciendo ahora a la derecha.
¿Alguna vez bash será reemplazado?
Lo que podría parecer inconcebible ahora puede suceder más tarde. A menos que queramos aferrarnos a la creencia de que todos usaremos Bash hasta el día del juicio final, la verdad es que algún día, Bash será reemplazado como el shell predeterminado de Linux, ya sea que siga siendo el shell estándar de GNU o no. O tal vez sea Bash, pero mejorado mucho más allá del shell que usamos hoy. Pero lo que sea que tome el lugar del Bash de hoy tendrá que ser completamente (o muy cerca) compatible con versiones anteriores o valer la pena la agitación, sean cuales sean los beneficios.
Esto no está exento de precedentes. Desde la versión 10.15 de macOS, Apple ha eliminado Bash y ha adoptado el shell Z como el shell predeterminado. Apple tiene problemas con la GNU General Public License (GPL) v.3. Desafortunadamente, esa es la licencia que usa Bash. La última versión de Bash lanzada bajo GPL v.2 fue la versión 3.2 de 2007. La versión actual es la 5.1. Apple estaba casi una década y media por detrás. La única forma en que Apple podía incluir un shell actualizado sin pasar a GPL v.3 era pasar a un shell completamente diferente. Para Apple, eso valió la pena la agitación. (Sin embargo, ¡aún puede volver a Bash en macOS si lo prefiere!)
Hay un mundo de diferencia entre la estación de trabajo de un usuario avanzado y un servidor Linux de línea de negocio que debe administrar de forma remota a través de una conexión SSH. De casi 1,5 millones de servidores alojados en Amazon EC2, más del 93% está ejecutando Linux. Casi el 75% de los servidores web están ejecutando Linux. Organizaciones como Red Hat, Amazon y Google usan Linux internamente.
Es difícil imaginar qué beneficios podría ofrecer una nueva cáscara que justificaría ese tipo de agitación global. Es por eso que Bash está cimentado en su lugar.
¡Incluso Microsoft ahora ofrece una forma de ejecutar un shell Bash basado en Linux en Windows 10!