Bash , abreviatura de Bourne-Again SHell , es un programa shell y un lenguaje de comandos respaldado por la Free Software Foundation [2] y desarrollado por primera vez para el Proyecto GNU [3] por Brian Fox . [4] Diseñado como una alternativa de software 100% [5] libre para Bourne Shell , [6] [7] [8] se lanzó inicialmente en 1989. [9] Su apodo es un juego de palabras, que hace referencia tanto a su predecesor , el caparazón de Bourne, [10] y el concepto de renacimiento . [11] [12]
Desde sus inicios, Bash ha obtenido una adopción generalizada y se utiliza comúnmente como shell de inicio de sesión predeterminado para numerosas distribuciones de Linux . Tiene importancia histórica como uno de los primeros programas portados a Linux por Linus Torvalds , junto con el compilador GNU ( GCC ). [13] Está disponible en casi todos los sistemas operativos modernos, lo que lo convierte en una herramienta versátil en diversos entornos informáticos.
Como procesador de comandos , Bash opera dentro de una ventana de texto donde los usuarios ingresan comandos para ejecutar diversas tareas. También admite la ejecución de comandos desde archivos, conocidos como scripts de shell , facilitando la automatización . De acuerdo con las convenciones del shell de Unix , Bash incorpora un rico conjunto de funciones. Las palabras clave , la sintaxis , las variables de ámbito dinámico y otras características básicas del lenguaje se copian del archivo sh. Otras funciones, por ejemplo, el historial , se copian de cshy del ksh. Bash es un shell compatible con POSIX , pero con varias extensiones.
Si bien bash se considera similar a Unix, [14] también está disponible en MacOS, Windows, BeOS, [15] [16] y Haiku. [17]
Brian Fox comenzó a codificar Bash el 10 de enero de 1988, [18] después de que Richard Stallman se sintiera insatisfecho con la falta de progreso realizado por un desarrollador anterior. [7] Stallman y la FSF consideraron un shell libre que pudiera ejecutar scripts de shell existentes tan estratégico para un sistema completamente libre construido a partir de código BSD y GNU que este fue uno de los pocos proyectos que financiaron ellos mismos, con Fox asumiendo el trabajo como empleado. de la FSF. [7] [19] Fox lanzó Bash como versión beta, versión .99, el 8 de junio de 1989, [9] y siguió siendo el mantenedor principal hasta algún momento entre mediados de 1992 [20] y mediados de 1994, [21] cuando fue despedido de la FSF [22] y su responsabilidad pasó a otro de los primeros contribuyentes, Chet Ramey. [23] [24] [25] [26] [27]
Desde entonces, Bash se ha convertido, con diferencia, en el shell más popular entre los usuarios de Linux, convirtiéndose en el shell interactivo predeterminado en las diversas distribuciones de ese sistema operativo [28] [29] y en las versiones de macOS de Apple anteriores a Catalina en octubre de 2019. [30] [31 ] [32] Bash también ha sido portado a Microsoft Windows [33] [34] y distribuido con Cygwin y MinGW , a DOS por el proyecto DJGPP , a Novell NetWare , a OpenVMS por el proyecto GNU, [35] a ArcaOS , [ 36] y a Android a través de varias aplicaciones de emulación de terminal.
En septiembre de 2014, Stéphane Chazelas, especialista en Unix/Linux, [37] descubrió un error de seguridad en el programa. El error, revelado por primera vez el 24 de septiembre, se llamó Shellshock y se le asignaron los números CVE - 2014-6271, CVE-2014-6277 y CVE-2014-7169. El error se consideró grave, ya que los scripts CGI que utilizan Bash podrían ser vulnerables, permitiendo la ejecución de código arbitrario . El error estaba relacionado con cómo Bash pasa definiciones de funciones a subcapas a través de variables de entorno . [38]
Como procesador de comandos , Bash opera dentro de una ventana de texto donde los usuarios ingresan comandos para ejecutar diversas tareas. También admite la ejecución de comandos desde archivos, conocidos como scripts de shell , facilitando la automatización . De acuerdo con las convenciones del shell de Unix , Bash incorpora un amplio conjunto de características, que incluyen:
Bash también ofrece...
set
integradas ) y opciones del shell ( shopt
integradas ) que alteran el comportamiento del shell;pushd
y popd
incorporados),help
,En particular, Bourne-Again SHell no proporciona...
Las palabras clave , la sintaxis , las variables de ámbito dinámico y otras características básicas del lenguaje se copian de sh . Otras características, por ejemplo, historial , se copian de csh y ksh .
La sintaxis del comando Bash es un superconjunto de la sintaxis del comando Bourne Shell. Bash admite expansión de llaves , [40] finalización de línea de comando (finalización programable), [41] depuración básica [42] [43] y manejo de señales (usando trap
) desde bash 2.05a [44] [45], entre otras características. Bash puede ejecutar la gran mayoría de los scripts de shell de Bourne sin modificaciones, con la excepción de los scripts de shell de Bourne que tropiezan con un comportamiento de sintaxis marginal interpretado de manera diferente en Bash o que intentan ejecutar un comando del sistema que coincida con una nueva función incorporada de Bash, etc. La sintaxis del comando de Bash incluye ideas dibujadas desde Korn Shell (ksh) y C shell (csh), como la edición de la línea de comandos, el historial de comandos ( history
command), [46] la pila de directorios, las variables $RANDOM
y y la sintaxis de sustitución de comandos$PPID
POSIX .$(...)
Cuando un usuario presiona la tecla tab dentro de un shell de comandos interactivo, Bash utiliza automáticamente la finalización de línea de comandos , desde la versión beta 2.04, [47] para hacer coincidir nombres de programas, nombres de archivos y nombres de variables parcialmente escritos. El sistema de finalización de línea de comandos de Bash es muy flexible y personalizable y, a menudo, incluye funciones que completan argumentos y nombres de archivos para programas y tareas específicos.
La sintaxis de Bash tiene muchas extensiones que faltan en el shell Bourne. Bash puede realizar cálculos con números enteros ("evaluación aritmética") sin generar procesos externos. Utiliza el ((...))
comando y la $((...))
sintaxis de variables para este propósito. Su sintaxis simplifica la redirección de E/S . Por ejemplo, puede redirigir la salida estándar (stdout) y el error estándar (stderr) al mismo tiempo utilizando el &>
operador. Esto es más sencillo de escribir que el equivalente del shell Bourne ' command > file 2>&1
'. Bash admite la sustitución de procesos utilizando la sintaxis <(command)
and >(command)
, que sustituye la salida (o la entrada) de un comando donde normalmente se usa un nombre de archivo. (Esto se implementa a través de /proc/fd/ canalizaciones sin nombre en sistemas que lo admiten, o mediante canalizaciones con nombre temporales cuando sea necesario).
Cuando se usa la palabra clave 'función', las declaraciones de funciones de Bash no son compatibles con los scripts Bourne/Korn/POSIX (KornShell tiene el mismo problema cuando se usa 'función'), pero Bash acepta la misma sintaxis de declaración de funciones que los shells Bourne y Korn. y es compatible con POSIX. Debido a estas y otras diferencias, los scripts de shell Bash rara vez se pueden ejecutar bajo los intérpretes de shell Bourne o Korn a menos que se escriban deliberadamente teniendo en cuenta esa compatibilidad, lo cual se vuelve menos común a medida que Linux se generaliza. Pero en el modo POSIX, Bash se ajusta más estrechamente a POSIX. [48]
Bash admite aquí documentos . Desde la versión 2.05b, Bash puede redirigir la entrada estándar (stdin) desde una "cadena aquí" usando el <<<
operador.
Bash 3.0 admite la coincidencia de expresiones regulares durante el proceso utilizando una sintaxis que recuerda a Perl . [49]
En febrero de 2009, [50] Bash 4.0 introdujo soporte para matrices asociativas . [51] Los índices de matriz asociativa son cadenas, de manera similar a AWK o Tcl . [52] Se pueden utilizar para emular matrices multidimensionales. Bash 4 también cambia su licencia a GPL-3.0 o posterior ; Algunos usuarios sospechan que este cambio de licencia es la razón por la que MacOS sigue utilizando versiones anteriores. [53] Apple finalmente dejó de usar Bash en sus sistemas operativos como shell predeterminado con el lanzamiento de MacOS Catalina en 2019. [54]
La expansión de llaves, también llamada alternancia, es una característica copiada del shell C. Genera un conjunto de combinaciones alternativas. Los resultados generados no necesitan existir como archivos. Los resultados de cada cadena expandida no se ordenan y se conserva el orden de izquierda a derecha:
$ echo a { p,c,d,b } e mono ace ade abe $ echo { a,b,c }{ d,e,f } ad ae af bd be bf cd ce cf
Los usuarios no deben utilizar expansiones de llaves en scripts de shell portátiles, porque el shell Bourne no produce el mismo resultado.
$ # bash shell $ /bin/bash -c 'echo a{p,c,d,b}e' ape ace ade abe $ # Un shell tradicional no produce el mismo resultado $ /bin/sh -c 'echo a {p,c,d,b}e' a{p,c,d,b}e
Cuando la expansión de llaves se combina con comodines, las llaves se expanden primero y luego los comodines resultantes se sustituyen normalmente. Por lo tanto, se puede obtener una lista de imágenes JPEG y PNG en el directorio actual usando:
es *. { jpg,jpeg,png } # se expande a *.jpg *.jpeg *.png - después de lo cual, # se procesan los comodines echo *. { png,jp { e, } g } # echo solo muestra las expansiones - # y las llaves entre llaves son posibles.
Además de la alternancia, la expansión de llaves se puede utilizar para rangos secuenciales entre dos números enteros o caracteres separados por puntos dobles. Las versiones más nuevas de Bash permiten que un tercer número entero especifique el incremento.
$ eco { 1 ..10 } 1 2 3 4 5 6 7 8 9 10 $ eco { 01 ..10 } 01 02 03 04 05 06 07 08 09 10 $ eco archivo { 1 ..4 } .txt archivo1.txt archivo2.txt archivo3.txt archivo4.txt $ eco { a..e } abcde $ eco { 1 ..10..3 } 1 4 7 10 $ eco { a..j..3 } adgj
Cuando la expansión de llaves se combina con la expansión variable (también conocida como expansión de parámetros y sustitución de parámetros ), la expansión variable se realiza después de la expansión de llaves, lo que en algunos casos puede requerir el uso del eval
incorporado, por lo tanto:
$ inicio = 1 ; end = 10 $ echo { $start .. $end } # no se expande debido al orden de evaluación {1..10} $ eval echo { $start .. $end } # se produce la expansión de la variable y luego se evalúa la cadena resultante 1 2 3 4 5 6 7 8 9 10
Cuando se inicia Bash, ejecuta los comandos en una variedad de archivos de puntos . A diferencia de los scripts de shell Bash, los archivos punto normalmente no tienen ni el permiso de ejecución habilitado ni una directiva de intérprete como #!/bin/bash
.
El siguiente ejemplo ~/.bash_profile
es compatible con el shell Bourne y proporciona una semántica similar a csh para ~/.bashrc
y ~/.bash_login
. Se trata de una evaluación de cortocircuito que prueba si el nombre del archivo existe y es legible, omitiendo la parte posterior si no lo es.[ -r filename ] && cmd
&&
[ -r ~/.perfil ] && . ~/.profile # configurar el entorno, una vez, sintaxis Bourne-sh solo si [ -n " $PS1 " ] ; entonces # ¿somos interactivos? [ -r ~/.bashrc ] && . ~/.bashrc # tty/prompt/configuración de función para shells interactivos [ -r ~/.bash_login ] && . ~/.bash_login # cualquier tarea al iniciar sesión solo para el shell de inicio de sesión fi # Fin del bloque "if"
Algunas versiones de Unix y Linux contienen scripts de inicio del sistema Bash, generalmente en el /etc
directorio. Bash ejecuta estos archivos como parte de su inicialización estándar, pero otros archivos de inicio pueden leerlos en un orden diferente al de la secuencia de inicio de Bash documentada. El contenido predeterminado de los archivos del usuario raíz también puede tener problemas, así como los archivos estructurales que el sistema proporciona a las nuevas cuentas de usuario durante la configuración. Los scripts de inicio que inician el sistema de ventanas X también pueden hacer cosas sorprendentes con los scripts de inicio de Bash del usuario en un intento de configurar variables de entorno del usuario antes de iniciar el administrador de ventanas . Estos problemas a menudo se pueden solucionar utilizando un archivo ~/.xsession
o ~/.xprofile
para leer ~/.profile
, que proporciona las variables de entorno que necesitan las ventanas de shell Bash generadas por el administrador de ventanas, como xterm o Gnome Terminal .
Invocar a Bash con la --posix
opción o indicarlo set -o posix
en un script hace que Bash se ajuste muy estrechamente al estándar POSIX 1003.2 . [55] Los scripts de shell Bash destinados a la portabilidad deben tener en cuenta al menos el estándar de shell POSIX. Algunas características de bash que no se encuentran en POSIX son: [55] [56]
[[...]]
y su coincidencia de expresiones regulares(( ... ))
; $(( ... ))
es POSIX)local
para variables de alcanceSi un fragmento de código utiliza dicha característica, se denomina "bashismo", un problema para el uso portátil. Se pueden utilizar Debian checkbashisms
y Vidar Holen shellcheck
para asegurarse de que un script no contenga estas partes. [58] [59] La lista varía dependiendo del shell de destino real: la política de Debian permite algunas extensiones en sus scripts (como lo están en el shell del tablero ), [56] mientras que un script que intenta soportar shells Bourne anteriores a POSIX, como autoconf , configure
están aún más limitados en las funciones que pueden utilizar. [60]
Bash usa GNU Readline para proporcionar atajos de teclado para editar la línea de comandos usando las combinaciones de teclas predeterminadas ( Emacs ). Los enlaces Vi se pueden habilitar ejecutando set -o vi
. [61]
El shell Bash tiene dos modos de ejecución de comandos: por lotes (asíncrono) y concurrente (sincrónico).
Para ejecutar comandos en modo por lotes (es decir, en secuencia), deben estar separados por el carácter ";", o en líneas separadas:
comando1 ; comando2comando3
En este ejemplo, cuando finaliza el comando1, se ejecuta el comando2 y cuando se completa el comando2, se ejecutará el comando3.
Puede ocurrir una ejecución en segundo plano del comando1 usando (símbolo &) al final de un comando de ejecución, y el proceso se ejecutará en segundo plano mientras se devuelve inmediatamente el control al shell y se permite la ejecución continua de los comandos.
comando1 &
O para tener una ejecución concurrente de dos comando1 y comando2, se deben ejecutar en el shell Bash de la siguiente manera:
comando1 y comando2
En este caso, comando1 se ejecuta en segundo plano y símbolo, devolviendo inmediatamente el control al shell que ejecuta comando2 en primer plano.
Se puede detener un proceso y devolver el control a bash escribiendo Ctrl+ zmientras el proceso se ejecuta en primer plano. [62]
Se puede obtener una lista de todos los procesos, tanto en segundo plano como detenidos, ejecutando jobs
:
$ trabajos [1] - Ejecutando comando1 y [2]+ Comando detenido2
En el resultado, el número entre paréntesis se refiere a la identificación del trabajo. El signo más indica el proceso predeterminado para bg
y fg
. Los textos "En ejecución" y "Detenido" se refieren al estado del proceso . La última cadena es el comando que inició el proceso.
El estado de un proceso se puede cambiar mediante varios comandos. El fg
comando pone un proceso en primer plano, mientras bg
establece un proceso detenido ejecutándose en segundo plano. bg
y fg
pueden tomar una identificación de trabajo como primer argumento, para especificar el proceso sobre el cual actuar. Sin uno, utilizan el proceso predeterminado, identificado por un signo más en la salida de jobs
. El kill
comando se puede utilizar para finalizar un proceso prematuramente, enviándole una señal . La identificación del trabajo debe especificarse después de un signo de porcentaje:
matar %1
Bash proporciona separadores de comandos de "ejecución condicional" que hacen que la ejecución de un comando dependa del código de salida establecido por un comando precedente. Por ejemplo:
cd " $ EN ALGÚN LUGAR " && ./hacer_algo || echo "Ocurrió un error" > & 2
Donde ./do_something solo se ejecuta si el comando cd (cambiar directorio) fue "exitoso" (devolvió un estado de salida de cero) y el comando echo solo se ejecutaría si el comando cd o ./do_something devuelve un "error" (estado de salida distinto de cero).
Para todos los comandos, el estado de salida se almacena en la variable especial $?
. Bash también admite formas de evaluación de comandos condicionales.if ...;then ...;else ...;fi
case $VARIABLE in $pattern)...;;$other_pattern)...;; esac
Un comando externo llamado bashbug informa errores del shell Bash. Cuando se invoca el comando, aparece el editor predeterminado del usuario con un formulario para completar. El formulario se envía por correo a los mantenedores de Bash (u opcionalmente a otras direcciones de correo electrónico). [63] [64]
Bash admite la finalización programable mediante comandos integrados complete
, compopt
y compgen
. [65] La característica ha estado disponible desde la versión beta de 2.04 lanzada en 2000. [66] [67] Estos comandos permiten una especificación de finalización compleja e inteligente para comandos (es decir, programas instalados), funciones, variables y nombres de archivos. [68]
Los comandos complete
y compopt
dos especifican cómo se enumerarán los argumentos de algunos comandos u opciones disponibles en la entrada de la línea de lectura . A partir de la versión 5.1, la finalización del comando o la opción generalmente se activa presionando una tecla después de escribir su nombre. [68]Tab ↹
El nombre del programa es una figura retórica o una ocurrencia que comienza con un homenaje a Stephen Bourne , el creador de uno de los programas shell que en ocasiones han sido considerados reemplazados por el shell bash. Su nombre se utiliza como un juego de palabras con la imagen del parto. Con ese juego de palabras, al parecer, se añade una alusión : posiblemente a la idea hindú o budista de la reencarnación ; posiblemente al modismo cristiano conocido como " nacer de nuevo "; o muy posiblemente simplemente a la idea más abstracta de renovación. Si bien numerosas traducciones al inglés del Nuevo Testamento cristiano , Libro de Juan , capítulo 3 contienen las palabras "nacido de nuevo", el diccionario Merriam-Webster define "nacido de nuevo" como "...persona que ha hecho un nacimiento renovado o confirmado". compromiso ... [69] "Cualquiera que haya sido la piedra de toque original, al final el programa recibió el nombre de "The Bourne Again SHell ". [70] [71]
El acrónimo de ese nombre entonces es "bash", una palabra que significa "golpear violentamente". [72] " En el contexto de la programación informática, "golpear violentamente algo", como un teclado de computadora, podría considerarse una imagen hiperbólica de cierta frustración . Se podría considerar que estas imágenes de emocionalidad negativa están en yuxtaposición directa con la idea de "nacer de nuevo".
El nombramiento podría considerarse un ejemplo de ironía verbal [73] o insinuación accidental . [74] La gramática de Bash se basó inicialmente en las gramáticas de los programas shell de Unix más populares que se utilizaban actualmente, algunos de los cuales se consideraban particularmente difíciles de usar o frustrantes en ese momento. A medida que pasaron los años, el desarrollo de bash hizo que su gramática fuera más fácil de usar, [75] [76] [77] [78] [79] [80] hasta tal punto que parece probable que el proyecto bash se haya comprometido a mejorar su usabilidad. Desde entonces, bash se ha convertido en el programa de shell predeterminado de facto en la mayoría de los sistemas operativos Linux y Unix.
Como estándar en el que se basa bash, POSIX, o IEEE Std 1003.1, [81] y siguientes, es informativo.
La página de manual de Linux [82] [83] pretende ser el documento explicativo autorizado para comprender cómo bash
funciona, mientras que el manual de GNU a veces se considera más fácil de leer. "También puede encontrar información sobre Bash ejecutando info bash... o consultando /usr/share/doc/bash/
, /usr/local/share/doc/bash/
o directorios similares en su sistema. Un breve resumen está disponible ejecutando bash --help. [70] "
En Linux modernos, la información sobre los comandos integrados del shell se puede encontrar ejecutando help,
help [built-in name]
o man builtins
en el indicador de terminal donde está instalado bash. Algunos comandos, como echo
, false
, kill
, printf
o , dependiendo de su sistema y de su versión de bash instalada localmente, pueden hacer referencia a un archivo ejecutable binario del sistema o integrado en el shell test
. true
Cuando ocurre una de estas colisiones de nombres de comandos, bash ejecutará de forma predeterminada una línea de comando determinada utilizando el shell integrado. Especificar la ruta absoluta de un ejecutable binario (es decir, /bin/printf
) es una forma de garantizar que el shell utilice un binario del sistema. Este problema de colisión de nombres también afecta a los "resúmenes de ayuda" vistos con kill --help
y /bin/kill --help
. Los archivos ejecutables binarios integrados del shell y del sistema del mismo nombre suelen tener opciones diferentes.
"El responsable del proyecto también tiene una página Bash que incluye preguntas frecuentes", [84] [85] [70] estas preguntas frecuentes están actualizadas a partir de la versión 5.1 de bash y ya no se actualizan.
A principios de septiembre de 2014 se descubrió un agujero de seguridad en Bash que data de la versión 1.03 (agosto de 1989), [86] denominado Shellshock , y rápidamente condujo a una serie de ataques en Internet . [87] [88] [89] Los parches para corregir los errores estuvieron disponibles poco después de que se identificaron los errores.
Desde 4.0: GPL-3.0 o posterior [90]
1.11? a 3.2: GPL-2.0 o posterior [91]
0,99? a 1.05?: GPL-1.0 o posterior [92] [51] [93]
También hay disponible una versión para Windows 10 y Windows 11 a través del Subsistema de Windows para Linux . [94] [95] También es el shell de usuario predeterminado en Solaris 11. [96] Bash también era el shell predeterminado en BeOS , [15] y en las versiones de Apple macOS desde 10.3 (originalmente, el shell predeterminado era tcsh ) hasta 10.15 ( macOS Catalina ), que cambió el shell predeterminado a zsh , [32] aunque Bash sigue disponible como shell alternativo. [54]
La Free Software Foundation (FSF) es una organización sin fines de lucro con la misión mundial de promover la libertad de los usuarios de computadoras.
El objetivo final es proporcionar software gratuito para realizar todos los trabajos que los usuarios de computadoras desean realizar y así hacer que el software propietario sea cosa del pasado.
Brian Fox ahora ha completado la versión GNU de sh, llamada BASH, el 'Bourne Again SHell'.
GNU es un sistema operativo que es software 100% libre.
El shell Bourne es un intérprete de comandos interactivo y un lenguaje de programación de comandos.
Durante un año y medio, el shell GNU estuvo "casi terminado". El autor hizo repetidas promesas de cumplir lo que había hecho y nunca las cumplió. Finalmente ya no podía creer que alguna vez entregaría algo. Por eso, Brian Fox, miembro del personal de la Fundación, está implementando ahora una imitación del caparazón de Bourne.
Cuando Richard Stallman decidió crear un reemplazo completo para los entonces sobrecargados sistemas Unix, sabía que eventualmente tendría que tener reemplazos para todas las utilidades comunes, especialmente el shell estándar, y esos reemplazos tendrían que tener licencias aceptables.NOTA: El enlace original de computerworld.com.au está inactivo: consulte también las copias del material original en
"Bourne Again Shell" es un juego de palabras con el nombre Bourne Shell , que era el shell habitual en Unix.
El nombre es un juego de palabras con el nombre de Bourne Shell (sh), uno de los primeros e importantes Unix shell escrito por Stephen Bourne y distribuido con la versión 7 de Unix alrededor de 1978, y el concepto de "nacer de nuevo".
Actualmente he portado bash(1.08) y gcc(1.40), y todo parece funcionar.
Fecha de nacimiento: domingo 10 de enero de 1988. Autor inicial: Brian Fox
Los empleados de la Free Software Foundation han escrito y mantenido varios paquetes de software GNU. Dos de ellos notables son la biblioteca C y el shell. ... Financiamos el desarrollo de estos programas porque el Proyecto GNU no se trataba sólo de herramientas o un entorno de desarrollo. Nuestro objetivo era un sistema operativo completo y estos programas eran necesarios para ese objetivo.
En Linux, la mayoría de los usuarios ejecutan bash porque es el shell más popular.
Bourne Again Shell (bash) es el shell más común instalado en las distribuciones de Linux.
Bash es, con diferencia, el shell más popular y constituye el shell predeterminado en los sistemas Linux y Mac OSX.
Bash es software gratuito, distribuido bajo los términos de la Licencia Pública General [GNU] publicada por la Free Software Foundation, versión 3 de la Licencia (o cualquier versión posterior).
Consulte test.c para GPL-2.0 o posterior