Bash (capa de Unix)

format_list_bulleted Contenido keyboard_arrow_down
ImprimirCitar
Sustitución GNU para la concha Bourne

Bash es un shell de Unix y un lenguaje de comandos escrito por Brian Fox para el Proyecto GNU como un reemplazo de software gratuito para el Bourne shell. Lanzado por primera vez en 1989, se ha utilizado como shell de inicio de sesión predeterminado para la mayoría de las distribuciones de Linux. Bash fue uno de los primeros programas que Linus Torvalds trasladó a Linux, junto con GCC. También hay una versión disponible para Windows 10 y Windows 11 a través del Subsistema de Windows para Linux. También es el shell de usuario predeterminado en Solaris 11. Bash también fue el shell predeterminado en las versiones de Apple macOS desde 10.3 (originalmente, el shell predeterminado era tcsh) hasta la versión 2019 de macOS Catalina, que cambió el shell predeterminado a zsh, aunque Bash permanece disponible como shell alternativo.

Bash es un procesador de comandos que normalmente se ejecuta en una ventana de texto donde el usuario escribe comandos que provocan acciones. Bash también puede leer y ejecutar comandos desde un archivo, llamado script de shell. Como la mayoría de los shells de Unix, es compatible con el globbing de nombres de archivos (coincidencia de comodines), tuberías, documentos aquí, sustitución de comandos, variables y estructuras de control para pruebas de condición e iteración. Las palabras clave, la sintaxis, las variables de alcance dinámico y otras características básicas del lenguaje se copian de sh. Otras funciones, por ejemplo, el historial, se copian de csh y ksh. Bash es un shell compatible con POSIX, pero con varias extensiones.

El nombre del caparazón es un acrónimo de Bourne Again Shell, un juego de palabras con el nombre del caparazón de Bourne al que reemplaza y la noción de "nacer de nuevo".

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), denominado Shellshock, y rápidamente provocó una serie de ataques en Internet. Los parches para corregir los errores se pusieron a disposición poco después de que se identificaran los errores.

Historia

Brian Fox comenzó a codificar Bash el 10 de enero de 1988, después de que Richard Stallman se sintiera insatisfecho con la falta de progreso de un desarrollador anterior. Stallman y la Free Software Foundation (FSF) consideraron un shell gratuito que pudiera ejecutar los scripts de shell existentes, tan estratégico para un sistema completamente gratuito 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 un empleado de la FSF. Fox lanzó Bash como versión beta, versión 99, el 8 de junio de 1989, y siguió siendo el responsable principal hasta algún momento entre mediados de 1992 y mediados de 1994, cuando fue despedido de la FSF y su responsabilidad pasó a ser otro de los primeros contribuyentes, Chet Ramey.

Desde entonces, Bash se ha convertido, con mucho, 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 (aunque el shell de Almquist puede ser el shell de secuencias de comandos predeterminado) y en Apple. Los lanzamientos de macOS 39 antes de Catalina en octubre de 2019. Bash también ha sido portado a Microsoft Windows y distribuido con Cygwin y MinGW, a DOS por el proyecto DJGPP, a Novell NetWare, a OpenVMS por el proyecto GNV, a ArcaOS 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, 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, lo que permitiría la ejecución de código arbitrario. El error estaba relacionado con la forma en que Bash pasa definiciones de funciones a subcapas a través de variables de entorno.

Características

La sintaxis del comando Bash es un superconjunto de la sintaxis del comando del shell Bourne. Bash admite la expansión de llaves, finalización de línea de comando (Finalización programable), depuración básica y manejo de señales (usando trap) desde bash 2.05a, 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 intentan ejecutar un comando del sistema que coincida con un Bash incorporado más nuevo, etc. La sintaxis del comando de Bash incluye ideas extraídas desde KornShell (ksh) y C shell (csh), como la edición de la línea de comandos, el historial de comandos (comando history), la pila de directorios, $RANDOM y variables $PPID y sintaxis de sustitución de comandos POSIX $(…).

Cuando un usuario presiona la tecla de tabulación dentro de un shell de comandos interactivo, Bash utiliza automáticamente la finalización de la línea de comandos, desde la versión beta 2.04, para hacer coincidir nombres de programas, nombres de archivos y nombres de variables parcialmente escritos. El sistema de finalización de la línea de comandos de Bash es muy flexible y personalizable, y suele incluir 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 de Bourne. Bash puede realizar cálculos de enteros ("evaluación aritmética") sin generar procesos externos. Utiliza el comando ((…)) y la sintaxis variable $((…)) 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 mediante el operador &>. Esto es más sencillo de escribir que el comando 'command > archivo 2>&1'. Bash admite la sustitución de procesos utilizando la sintaxis <(command) y >(command), que sustituye la salida de (o la entrada) de un comando donde normalmente se encuentra un nombre de archivo. usado. (Esto se implementa a través de /proc/fd/ conductos sin nombre en sistemas que lo admiten, o mediante conductos temporales con nombre cuando sea necesario).

Al usar la 'función' palabra clave, las declaraciones de funciones de Bash no son compatibles con los scripts de Bourne/Korn/POSIX (el KornShell tiene el mismo problema cuando usa 'función'), pero Bash acepta la misma sintaxis de declaración de funciones que los shells de Bourne y Korn, y es compatible con POSIX. Debido a estas y otras diferencias, los scripts de shell Bash rara vez se pueden ejecutar con los intérpretes de shell Bourne o Korn, a menos que se escriban deliberadamente teniendo en cuenta esa compatibilidad, lo que se está volviendo menos común a medida que Linux se generaliza. Pero en el modo POSIX, Bash se ajusta más a POSIX.

Bash admite documentos aquí. Desde la versión 2.05b, Bash puede redirigir la entrada estándar (stdin) desde una "cadena aquí" utilizando el operador <<<.

Bash 3.0 admite la coincidencia de expresiones regulares en proceso mediante una sintaxis que recuerda a Perl.

En febrero de 2009, Bash 4.0 introdujo soporte para arreglos asociativos. Los índices de matrices asociativas son cadenas, de manera similar a AWK o Tcl. 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 continúa usando versiones anteriores. Apple finalmente dejó de usar Bash en sus sistemas operativos como shell predeterminado con el lanzamiento de MacOS Catalina en 2019.

Expansión de tirantes

La expansión de llaves, también llamada alternancia, es una función 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:

$ eco a{}p,c,d,b}e
ape ace ade abe$ eco {}a,b,c} {}d,e,f}ad ae af bd be bf cd ce cf

Los usuarios no deben usar expansiones de llaves en scripts de shell portátiles, porque el shell Bourne no produce el mismo resultado.

$ # Una cáscara tradicional no produce la misma salida$ /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 podría obtener una lista de imágenes JPEG y PNG en el directorio actual usando:

Es...{}jpg,jpeg,png} # expande a *.jpg *.jpeg *.png - después de lo cual, # Los comodines son procesadoseco *.{}png,jp{}e,}g} # echo just show the expansions - # y los frenos en los sujetadores son posibles.

Además de la alternancia, la expansión de llaves se puede usar para rangos secuenciales entre dos números enteros o caracteres separados por puntos dobles. Las versiones más nuevas de Bash permiten un tercer entero para especificar el incremento.

$ eco {}1..10}1 2 3 4 5 6 7 8 9 10$ eco {}01..10}01 02 03 05 06 07 08 09 10$ eco archivo{}1..4}.txt
file1.txt file2.txt file3.txt file4.txt$ eco {}a..e}ab$ eco {}1..10..3.}1 4 7 10$ eco {}a.j..3}a d

Cuando la expansión de la llave 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 la llave, que en algunos casos puede requerir el uso del eval incorporado, por lo tanto:

$ Empieza=1; final=10$ eco {}$start..Donación} # fails to expand due to the evaluation order{1..10}$ eval eco {}$start..Donación} # expansión variable ocurre entonces se evalúa la cadena resultante1 2 3 4 5 6 7 8 9 10

Guiones de inicio

Cuando se inicia Bash, ejecuta los comandos en una variedad de archivos de puntos. A diferencia de los scripts de shell de Bash, los archivos de puntos normalmente no tienen habilitado el permiso de ejecución ni una directiva de intérprete como #!/bin/bash.

Ejemplo de inicio de Bash compatible con Legacy

El esqueleto ~/.bash_profile a continuación es compatible con el shell Bourne y proporciona una semántica similar a csh para ~/.bashrc y ~/.bash_login . El [ -r nombre de archivo ] && cmd es una evaluación de cortocircuito que prueba si nombre de archivo existe y es legible, omitiendo la parte después de && si no lo es.

[ -r ~/.profile ] ". ~/.profile # Establecer el ambiente, una vez, sintaxis Bourne-sh sólosi [ -n "$PS1" ] ; entonces # ¿Estamos interactivos? [ -r ~/.bashrc ] ". ~/.bashrc # tty/prompt/function setup for interactive shells [ -r ~/.bash_login ] ". ~/.bash_login # any at-login tasks for login shell onlyfi # Fin del bloque "si"

Problemas del sistema operativo en el inicio de Bash

Algunas versiones de Unix y Linux contienen scripts de inicio del sistema Bash, generalmente en los directorios /etc. Bash los llama 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 básicos 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 las variables de entorno del usuario antes de iniciar el administrador de ventanas. Estos problemas a menudo se pueden solucionar usando un archivo ~/.xsession o ~/.xprofile para leer el ~/.profile, que proporciona la Las variables de entorno que las ventanas de shell de Bash generaron a partir del administrador de ventanas necesitan, como xterm o Gnome Terminal.

Portabilidad

Invocar a Bash con la opción --posix o indicar set -o posix en un script hace que Bash se ajuste mucho al estándar POSIX 1003.2. 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:

  • Ciertas opciones de invocación ampliadas
  • Ampliación
  • Arrays and associative arrays
  • El doble corchete [[... ]] construcción de pruebas ampliadas y su reex coincidente
  • La construcción de doble paréntesis aritmética-evaluación (sólo ((...)); $((...)) es POSIX)
  • Ciertas operaciones de manipulación de cadenas en expansión del parámetro
  • local para variables de alcance
  • Substitución de procesos
  • Construcciones específicas de Bash
  • Coprocesos
  • $EPOCHSECONDS y variables $EPOCHREALTIME

Si un fragmento de código utiliza una característica de este tipo, se denomina "bashism" – un problema para el uso portátil. Los checkbashisms de Debian y Vidar Holen's shellcheck puede usarse para asegurarse de que un script no contiene estas partes. La lista varía según el shell de destino real: la política de Debian permite algunas extensiones en sus secuencias de comandos (como están en el shell del tablero), mientras que una secuencia de comandos que pretende admitir shells Bourne anteriores a POSIX, como autoconf's configure, son aún más limitadas en las características que pueden usar.

Métodos abreviados de teclado

Bash usa readline para proporcionar atajos de teclado para la edición de la línea de comando usando las asociaciones de teclas predeterminadas (Emacs). Los enlaces vi se pueden habilitar ejecutando set -o vi.

Gestión de procesos

El shell Bash tiene dos modos de ejecución de comandos: por lotes y modo concurrente.

Para ejecutar comandos por lotes (es decir, en secuencia), deben estar separados por el carácter ";", o en líneas separadas:

comando1; comando2

en este ejemplo, cuando finaliza el comando1, se ejecuta el comando2.

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 devolviendo inmediatamente el control al shell y permitiendo la ejecución continua de los comandos.

comando1 "

O para tener una ejecución simultánea de dos command1 y command2, deben ejecutarse en el shell Bash de la siguiente manera:

comando1 " comando2

En este caso, el comando1 se ejecuta en segundo plano con el símbolo &, devolviendo inmediatamente el control al shell que ejecuta el comando2 en primer plano.

Se puede detener un proceso y devolver el control a bash escribiendo Ctrl+z mientras el proceso se está ejecutando en primer plano.

Se puede obtener una lista de todos los procesos, tanto en segundo plano como detenidos, ejecutando jobs:

$ empleo[1]- Orden de ejecución1 "[2]+ Alto comando2

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. El texto "Corriendo" y "Detenido" consulte el estado del proceso. La última cadena es el comando que inició el proceso.

El estado de un proceso se puede cambiar usando varios comandos. El comando fg trae un proceso al primer plano, mientras que bg establece un proceso detenido ejecutándose en segundo plano. bg y fg pueden tomar una identificación de trabajo como su primer argumento, para especificar el proceso en el que actuar. Sin uno, usan el proceso predeterminado, identificado por un signo más en la salida de jobs. El comando kill se puede utilizar para finalizar un proceso antes de tiempo, enviándole una señal. La identificación del trabajo debe especificarse después de un signo de porcentaje:

matar %1

Ejecución condicional

Bash suministra "ejecución condicional" separadores de comandos que hacen que la ejecución de un comando dependa del código de salida establecido por un comando precedente. Por ejemplo:

cd "$SOMEWHERE" "./do_something Silencio eco "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 & #34;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 if...;entonces...;else...;fi y case $ VARIABLE en $patrón)...;;$otro_patrón)...;; esac formas de evaluación de comandos condicionales.

Informe de errores

Un comando externo llamado bashbug informa errores de shell de 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 responsables de Bash (u opcionalmente a otras direcciones de correo electrónico).

Finalización programable

Bash admite la finalización programable a través de complete integrado, compopt y compgen. La función ha estado disponible desde la versión beta de 2.04 lanzada en 2000. Estos comandos permiten una especificación de finalización compleja e inteligente para comandos (es decir, programas instalados), funciones, variables y nombres de archivo.

El completo y compopt dos comandos 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 con la pulsación de tecla Tab ↹ después de escribir su nombre.

Historial de versiones

Versión Fecha de lanzamiento Notas de lanzamiento
bash-5.2 2022-09-26 NOTICIAS
bash-5.1 2020-12-07 historia de la versión github
Bash-5.0 2019-01-07
bash-5.0-rc 1 2018-12-20
bash-5.0-beta2 2018-11-28
bash-5.0-beta 2018-09-17
bash-5.0-alpha 2018-05-22
bash-4.4 2016-09-15 historia de la versión de github NEWS v4.4
bash-4.4-rc2 2016-08-22
bash-4.4-rc 1 2016-02-24
bash-4.4-beta2 2016-07-11
bash-4.4-beta 2015-10-12
bash-4.3 2014-02-26
bash-4.2 2011-02-13
bash-4.1 2009-12-31
Bash-4.0 2009-02-20
bash-4.0-rc 1 2009-01-12
bash-3.2 2006-10-11
bash-3.1 2005-12-08
Bash-3.0 2004-08-03
Bash-2.05b 2002-07-17
bash-2.05a 2001-11-16
Bash-2.05 2001-04-09
Bash-2.04 2000-03-21
Bash-2.03 1999-02-19
Bash-2.02 1998-04-18
Bash-2.01 1997-06-05
Bash-2.0 1996-12-31

Contenido relacionado

Comodoro 1581

El Commodore 1581 es una unidad de disquete de doble densidad y doble cara de 3½ pulgadas que fue lanzada por Commodore Business Machines en 1987...

Transporte en las Islas Vírgenes Británicas

Los sistemas de transporte en las Islas Vírgenes Británicas incluyen 113 kilómetros de carretera y un puerto en Road...

Audio

Audio comúnmente se refiere al sonido, ya que se transmite en forma de señal. También puede referirse...
Más resultados...
Tamaño del texto:
undoredo
format_boldformat_italicformat_underlinedstrikethrough_ssuperscriptsubscriptlink
save