Bash (shell Unix)
La sintaxis de comandos Bash es un superconjunto de la sintaxis de comandos Bourne shell. Bash admite expansión de llaves, finalización de línea de comandos (Finalización programable), depuración básica y manejo de señales (utilizando trap
) desde bash 2.05 a, 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 un nuevo builtin de Bash, etc. La sintaxis de comandos Bash incluye ideas extraídas de KornShell (ksh) y C shell (csh), como la edición de la línea de comandos, el historial de comandos (history
comando), la pila de directorios, las variables $RANDOM
y $PPID
y la sintaxis de sustitución de comandos POSIX $(…)
.
Cuando un usuario presiona la tecla tab dentro de un shell de comandos interactivo, Bash usa automáticamente la finalización de la línea de comandos, desde la versión beta 2.04, para hacer coincidir los nombres de programas, nombres de archivos y nombres de variables parcialmente escritos. El sistema de finalización de línea de comandos Bash es muy flexible y personalizable, y a menudo está empaquetado con funciones que completan argumentos y nombres de archivo 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 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 utilizando el operador &>
. Esto es más sencillo de escribir que el equivalente de Bourne shell ‘command > file 2>&1
‘. Bash soporta la sustitución de procesos usando la sintaxis <(command)
y >(command)
, que sustituye la salida (o entrada) de un comando donde normalmente se usa un nombre de archivo. (Esto se implementa a través de tuberías sin nombre/proc/ fd / en sistemas que soportan eso, o a través de tuberías con nombre temporal cuando sea necesario).
Cuando se usa la palabra clave ‘function’, las declaraciones de función Bash no son compatibles con los scripts Bourne/Korn/POSIX (el KornShell tiene el mismo problema cuando se usa’ function’), pero Bash acepta la misma sintaxis de declaración de función que los shells Bourne y Korn, y es compatible con POSIX. Debido a estas y otras diferencias, los scripts de shell de Bash rara vez se pueden ejecutar bajo los intérpretes de shell de Bourne o Korn, a menos que se escriban deliberadamente con esa compatibilidad en mente, lo que se está volviendo menos común a medida que Linux se extiende más. Pero en el modo POSIX, Bash se ajusta más a POSIX.
Bash soporta aquí documentos. Desde la versión 2.05 b, Bash puede redirigir la entrada estándar (stdin) desde una cadena «here» utilizando el operador <<<
.
Bash 3.0 admite la coincidencia de expresiones regulares en proceso utilizando una sintaxis que recuerda a Perl.
En febrero de 2009, Bash 4.0 introdujo el soporte para matrices asociativas. Los índices de matriz asociativa son cadenas, de una manera similar a AWK o Tcl. Se pueden utilizar para emular matrices multidimensionales. Bash 4 también cambia su licencia a GPLv3; algunos usuarios sospechan que este cambio de licencia es la razón por la que macOS sigue utilizando versiones anteriores. Apple finalmente dejó de usar Bash en sus sistemas operativos con el lanzamiento de macOS Catalina en 2019.
Expansión de corséeditar
La expansión de corsé, también llamada alternancia, es una característica copiada del shell de 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}eape ace ade abe$ echo {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 de Bourne no produce la misma salida.
$ # A traditional shell does not produce the same output$ /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 utilizando:
ls *.{jpg,jpeg,png} # expands to *.jpg *.jpeg *.png - after which, # the wildcards are processedecho *.{png,jp{e,}g} # echo just show the expansions - # and braces in braces are possible.
Además de la alternancia, la expansión de llaves se puede usar para rangos secuenciales entre dos enteros o caracteres separados por puntos dobles. Las versiones más recientes de Bash permiten un tercer entero para especificar el incremento.
$ echo {1..10}1 2 3 4 5 6 7 8 9 10$ echo file{1..4}.txtfile1.txt file2.txt file3.txt file4.txt$ echo {a..e}a b c d e$ echo {1..10..3}1 4 7 10$ echo {a..j..3}a d g j
Cuando la expansión de la abrazadera se combina con la expansión variable, la expansión variable se realiza después de la expansión de la abrazadera, que en algunos casos puede requerir el uso de eval
incorporado, por lo:
$ start=1; end=10$ echo {$start..$end} # fails to expand due to the evaluation order{1..10}$ eval echo {$start..$end} # variable expansion occurs then resulting string is evaluated1 2 3 4 5 6 7 8 9 10
Inicio scriptsEdit
Cuando se inicia Bash, ejecuta los comandos en una variedad de archivos de puntos. A diferencia de los scripts de shell Bash, los archivos dot no suelen tener permisos de ejecución habilitados ni una directiva de intérprete como #!/bin/bash
.
Ejemplo de inicio de Bash compatible con Legacy Edit
El esqueleto ~/.bash_profile
a continuación es compatible con el shell de Bourne y proporciona una semántica similar a csh para ~/.bashrc
y ~/.bash_login
. El && cmd
es una evaluación de cortocircuito que prueba si el nombre del archivo existe y es legible, omitiendo la parte después del &&
si no lo es.
&& . ~/.profile # set up environment, once, Bourne-sh syntax onlyif ; then # are we interactive? && . ~/.bashrc # tty/prompt/function setup for interactive shells && . ~/.bash_login # any at-login tasks for login shell onlyfi # End of "if" block
Problemas del sistema operativo en Bash startupEdit
Algunas versiones de Unix y Linux contienen scripts de inicio del sistema Bash, generalmente bajo 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 documentada de Bash. El contenido predeterminado de los archivos del usuario root también puede tener problemas, así como los archivos esqueleto que el sistema proporciona a las nuevas cuentas de usuario al configurarlos. Los scripts de inicio que inician el sistema de ventanas X también pueden hacer cosas sorprendentes con los scripts de inicio Bash del usuario en un intento de configurar variables de entorno de usuario antes de iniciar el gestor de ventanas. Estos problemas a menudo se pueden resolver usando un archivo ~/.xsession
o ~/.xprofile
para leer el ~/.profile
, que proporciona las variables de entorno que las ventanas de shell Bash generadas desde el administrador de ventanas necesitan, como xterm o Gnome Terminal.
PortabilityEdit
Invocar Bash con la opción --posix
o indicar set -o posix
en un script hace que Bash se ajuste muy de cerca 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 extendidas
- Expansión de llaves
- Matrices y matrices asociativas
- El soporte doble
]
construcción de prueba extendida y su coincidencia de expresiones regulares - La construcción de evaluación aritmética de paréntesis dobles (solo
(( ... ))
;$ ((... ))
es POSIX) - Ciertas operaciones de manipulación de cadenas en expansión de parámetros
-
local
para variables de ámbito - Sustitución de procesos
- builtins específicos de Bash
- Coprocesos
- variables EPOCHSECONDS y variables EPOCHREALTIME variables
Si un fragmento de código utiliza tal característica, se denomina «bashismo», un problema para uso portátil. El checkbashisms
de Debian y el shellcheck
de Vidar Holen se pueden usar para asegurarse de que un script no contenga estas partes. La lista varía dependiendo del shell de destino real: La política de Debian permite algunas extensiones en sus scripts (como están en dash
), mientras que un script que intenta soportar shells Bourne pre-POSIX, como configure
de autoconf, está aún más limitado en las características que puede usar.
Teclado cortadoedItar
Bash utiliza readline para proporcionar atajos de teclado para la edición en línea de comandos utilizando los enlaces de teclas predeterminados (Emacs). Los enlaces Vi se pueden habilitar ejecutando set -o vi
.
Gestión de procesosedItar
El shell de Bash tiene dos modos de ejecución para los comandos: por lotes y modo concurrente.
Para ejecutar los comandos de proceso por lotes (es decir, en la secuencia) deben estar separados por el carácter «;», o en líneas separadas:
command1; command2
en este ejemplo, cuando command1 está terminado, command2 se ejecuta.
Una ejecución en segundo plano del comando 1 puede ocurrir 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 comandos.
command1 &
O la ejecución simultánea de dos command1 y command2, que se debe ejecutar en el shell Bash de la siguiente manera:
command1 & command2
En este caso command1 se ejecuta en segundo plano & símbolo, devolver inmediatamente el control de la shell que se ejecuta command2 en el primer plano.
Se puede detener un proceso y devolver el control a bash escribiendo Ctrl + z mientras el proceso se ejecuta en primer plano.
Se puede obtener una lista de todos los procesos, tanto en segundo plano como detenidos, ejecutando jobs
:
$ jobs- Running command1 &+ Stopped command2
En la salida, el número entre paréntesis se refiere al id del trabajo. El signo más significa el proceso predeterminado para bg
y fg
. El texto «Running » y» Stopped » se refieren al 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 que se ejecuta en segundo plano. bg
y fg
pueden tomar un id de trabajo como primer argumento, para especificar el proceso sobre el que actuar. Sin uno, utilizan el proceso predeterminado, identificado por un signo más en la salida de jobs
. El comando kill
se puede usar para finalizar un proceso prematuramente, enviándole una señal. El id del trabajo debe especificarse después de un signo de porcentaje:
kill %1
Conditional executionEdit
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 "$SOMEWHERE" && ./do_something || echo "An error occurred" >&2
Dónde ./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 cd o el .el comando / 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 if ...;entonces ...; else ...; fi
y case VARIABLE VARIABLE en pattern pattern)...;; other other_pattern)...;; esac
formas de evaluación de comandos condicionales.
Bug reportingEdit
Un comando externo llamado bashbug informa de errores de shell de Bash. Cuando se invoca el comando, muestra el editor predeterminado del usuario con un formulario para rellenar. El formulario se envía por correo a los mantenedores de Bash (u opcionalmente a otras direcciones de correo electrónico).
Finalización programableditar
Finalización programable Bash,complete
ycompgen
los comandos han estado disponibles desde la versión beta de 2.04 en 2000. Estas funciones permiten completar de forma inteligente complejos, como ofrecer opciones de programa disponibles para completar pestañas y, luego, después de que el usuario seleccione una opción que requiera un nombre de archivo como su siguiente entrada, solo completar automáticamente las rutas de archivo (y no otras opciones) para el siguiente token.
Leave a Reply