Bash (abreviatura de " Bourne Again SHell ") es un intérprete de comandos interactivo y un lenguaje de comandos desarrollado para sistemas operativos tipo Unix . Respaldado por la Free Software Foundation y creado en 1989 por Brian Fox para el Proyecto GNU , está diseñado como una alternativa de software completamente libre para el shell Bourne y otros shells Unix propietarios . [ 5 ] Habiendo alcanzado una amplia adopción, Bash se usa comúnmente como el shell de inicio de sesión predeterminado para numerosas distribuciones de Linux . [ 6 ] También admite la ejecución de comandos desde archivos, conocidos como scripts de shell , lo que facilita la automatización .sh
La sintaxis de comandos de Bash es un superconjunto de la sintaxis de Bourne Shell , de la cual se copiaron todas las características básicas de la sintaxis de Bash. Como resultado, Bash puede ejecutar la gran mayoría de los scripts de Bourne Shell sin modificaciones. Algunas otras ideas se tomaron prestadas de C Shell , su sucesor tcsh y Korn Shell . [ 7 ] Está disponible en casi todos los sistemas operativos modernos, lo que la convierte en una herramienta versátil en diversos entornos informáticos.
Definiciones
ASCII, cadenas y números
El idioma de entrada al intérprete de comandos se reconocerá primero a nivel de caracteres. [ b ]
— IEEE y The Open Group
$ printf '<newline>: <%b>\n' $'\n' <newline>: < > $ printf '<tab>: <%b>\n' $'\t' <tab>: < > $ printf '<space>: <%s>\n' " " <space>: < > $ printf '<NUL>: <%b>\n' $'\0' <NUL>: <>Cualquier serie de caracteres se denomina "cadena" o, a veces, " literal de cadena ". En los sistemas operativos tipo Unix, todos los caracteres, tanto imprimibles como no imprimibles, excepto algunos como el carácter nulo y la barra inclinada / , pueden utilizarse en los nombres de archivo . Además, todas las cadenas distinguen entre mayúsculas y minúsculas. [ c ]
Bash, al igual que muchos otros lenguajes de programación, utiliza una numeración basada en cero .
Combinaciones de teclas Control+
La funcionalidad Control+tecla la proporciona GNU Readline y solo está disponible en modo interactivo. Ciertas combinaciones de teclas permiten al usuario operar Bash para usar la función de autocompletado y buscar en el historial de comandos.
- Tab ↹– Activar la función de autocompletar con pestañas
- ↑– Desplácese hacia arriba (es decir, hacia atrás) en el historial de comandos.
- ↓– Desplácese hacia abajo (es decir, hacia adelante) en el historial de comandos.
- Ctrl+r – Buscar en el historial de comandos
Algunas combinaciones de teclas también permiten al usuario operar el emulador de terminal para mover el cursor dentro de la ventana del terminal y controlar el programa emulador. [ 10 ] Por defecto, estas combinaciones de teclas en Bash reflejan las de Emacs . [ d ]
Las combinaciones de teclas predeterminadas para los códigos de control incluyen:
- Ctrl+f – Mueve el cursor un carácter a la derecha
- Ctrl+b – Mueve el cursor un carácter a la izquierda
- Alt+f – Mueve el cursor una palabra a la derecha
- Alt+b – Mueve el cursor una palabra a la izquierda
- Ctrl+a – Mueve el cursor al principio de la línea de comandos actual.
- Ctrl+c – Cancela el comando actual y muestra un nuevo mensaje.
- Ctrl+d – Cierra la instancia actual de Bash, posiblemente también cerrando el emulador de terminal.
- Ctrl+e – Mueve el cursor al final de la línea de comandos actual.
- Ctrl+q – Activa la terminal; las pulsaciones de teclas almacenadas en búfer se procesan a continuación.
- Ctrl+s – Poner la terminal en modo de suspensión
- Ctrl+w – Elimina una palabra a la izquierda del cursor
- Ctrl+z – Detener un proceso en primer plano
También están disponibles las combinaciones de teclas de Vi y se pueden habilitar ejecutando . [ e ]set-ovi
Sintaxis
Cuando Bash lee una línea de comandos completa, la cadena completa se divide en tokens. Los "tokens" se identifican mediante y se separan entre sí mediante metacaracteres .
A partir de Bash 5.3, los 10 metacaracteres son el espacio, la tabulación y el salto de línea, así como los siguientes caracteres:|&;()<>
Los "espacios en blanco" están compuestos enteramente de metacaracteres sin comillas, los "operadores" contienen al menos un metacaracter sin comillas cada uno y las "palabras" no pueden incluir ningún metacaracter sin comillas.
En la práctica, Bash divide las cadenas de comandos completas en tokens o grupos de tokens que contienen metacaracteres y tokens o grupos de tokens que no los contienen, denominados "palabras" . A partir de ahí, subdivide las palabras en partes más específicas y significativas, como nombres de comandos, instrucciones de asignación de variables, etc.
Los dos espacios en blanco son un espacio y una tabulación.
Operadores
Los operadores de control realizan una función de control . Pueden ser un salto de línea o uno de los siguientes: ||, &&, &, ;, ;;, ;&, ;;&, |, |&, (, o ).
Los operadores de redirección redirigen los flujos de entrada o salida. Estos incluyen <, >, , , y .&><<<<<
Palabras
Una palabra es una secuencia de caracteres (no meta) tratada como una sola unidad por el intérprete de comandos. Una palabra reservada es un tipo de palabra que tiene un significado especial para el intérprete de comandos. [ f ]
Un nombre es un tipo de palabra distinta de las palabras reservadas . Los nombres (A) constan únicamente de letras, guiones bajos y números, (B) comienzan con una letra o un guion bajo, y (C) no pueden comenzar con un número. También llamados identificadores, los nombres se pueden usar para nombrar variables y funciones.
Dieciséis de las veintidós "palabras reservadas", que pueden ser caracteres o palabras, son las siguientes:
'!' '[[' '{' ']]' '}' caso en esac para hacer hecho si entonces si no fi ... Los nombres solo pueden contener los caracteres ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.
En el siguiente ejemplo de una cadena de comando completa, los metacaracteres tienen una coma colocada encima de ellos, , , las palabras reservadas tienen un acento circunflejo colocado debajo de ellas, ^ , y otros tokens tienen una tilde grave colocada también debajo de ellos, ` .
$ #, , , ,, , ,, , $ if echo foo ; then bar = abc ; fi $ # ^^ ```` ``` ^^^^ ``````` ^^Subcapas
Un "subproceso" es una instancia adicional del intérprete de comandos que ha sido inicializada por una instancia actual del mismo. Cuando un intérprete de comandos "padre" crea un subproceso, o un intérprete de comandos "hijo", se recrea una copia exacta de la información del entorno del padre, que se convierte en el entorno del subproceso.
En Bash, en contextos no aritméticos, se puede forzar el uso de un subproceso encerrando una cadena de comandos completa entre paréntesis simples .
$ echo foo ; ( echo foo ) foo fooEn este caso sencillo, los dos comandos anteriores son equivalentes; sin embargo, el uso de subprocesos puede tener ciertos efectos secundarios inesperados. Existen numerosas formas de sintaxis que pueden provocar la inicialización de un subproceso. A continuación, se presenta una lista no exhaustiva de operadores que provocan la inicialización de un subproceso:
- La sintaxis de subshells,
()por ejemplo, inicializaría un subshell:$ ( programa arga argb )
- La sintaxis de tuberías
A | Binicializaría múltiples subprocesos, uno para cada comando separado en la tubería:$ programa1 abc definición | programa2 -abc
Expansión
Estructuras de datos
Bash ofrece variables y arreglos como estructuras de datos, y aunque existen numerosos tipos de cada una, las estructuras de datos son relativamente simples en comparación con otros lenguajes como C o Java . Todos los datos se almacenan en memoria como cadenas de texto.
El signo de dólar al inicio de una palabra indica que se trata del nombre de una variable o matriz. Siempre se recomienda encerrar la sintaxis del signo de dólar/nombre de variable entre comillas dobles. Esta práctica protege los valores de los parámetros de posibles efectos secundarios no deseados.
Se recomienda encerrar el nombre de la variable entre llaves {}para mayor legibilidad y coherencia entre variables y arreglos. Al escribir variables, las llaves son opcionales y los corchetes constituirían un error de sintaxis. Los nombres de los parámetros siempre se colocan a la izquierda del signo igual y los valores, a la derecha.
Variables
Se asigna una variable utilizando la sintaxis name=value.
Para usar una variable, $namese utiliza la sintaxis, o ${name}, que se expande al valor asignado a la variable.
Esta última sintaxis debe usarse para ciertos nombres para evitar efectos secundarios no deseados. Por ejemplo, $10se analizará como ${1}0, por lo que usar ${10}significa que se analizará como se espera.
Los parámetros posicionales, que normalmente se pasan a un script bash, se indican mediante variables numeradas a partir de $1. Los parámetros especiales se indican con caracteres de puntuación. Por ejemplo, "$@"se expande a una lista de los parámetros posicionales del primero al último, entrecomillados individualmente y separados por espacios. [ g ]
Las variables de entorno se representan con letras mayúsculas. Entre ellas se incluyen variables de UNIX como `<variable>` LESS_SIGUSR1y variables de la shell Bourne como ` HOME<variable>`. Las variables de script se representan con letras minúsculas o en formato CamelCase. Esto es solo una convención; cualquier variable puede pasarse al exportcomando para que se convierta en una variable de entorno.
Matrices
Los arreglos son estructuras de datos que almacenan múltiples valores. [ h ]
Los arreglos tienen un conjunto de corchetes colocados al final del nombre de la variable y dentro de las llaves. Al escribir arreglos, se requieren llaves y corchetes.
Se asigna un array usando la sintaxis name=( one or more elements ). Se expande usando o o , dependiendo del caso de uso.${quux[@]}${quux[*]}${quux[1]}
Cada tipo de parámetro se distingue por una convención de nomenclatura específica . [ i ]
Desde Bash 4.0, Bash también admite matrices asociativas . [ 2 ]
En este artículo, algunos ejemplos de variables de esta sección incluyen ${foo}, PID, PWD, EUID, $$ , ${quux} y ${zork} .
Ejecución
La "ejecución" de un programa determinado se produce cuando un usuario (o algún otro programa) le pide al sistema operativo que actúe conforme a las instrucciones contenidas en dicho programa.
Por defecto, Bash lee el código del usuario línea por línea, interpreta cualquier salto de línea o punto y coma ;como el final del comando actual y ejecuta los comandos en secuencia. Si un comando interactivo se extiende más allá del ancho del emulador de terminal, normalmente es posible seguir escribiendo y el comando se ajustará automáticamente. Para extender un comando más allá de un salto de línea a una línea adicional, es necesario que el último carácter de la primera línea sea una barra invertida sin escape, \, que indica "continuación de línea". Bash siempre termina de analizar y ejecutar una línea de comandos completa antes de pasar a analizar la siguiente.
$ foo = aa bar = bb quux = cc zork = dd ; establecer -o xtrace $ : " ${ foo } " ; : " ${ bar } " + : aa + : bb $ : " ${ quux } " \ > : " ${ zork } " + : cc : ddLa primera palabra de una línea de comandos se conoce como la "posición del comando". Según la convención de UNIX, la primera palabra de la línea de comandos siempre es algún tipo de comando, y el resto de las palabras en la cadena de la línea de comandos son opciones para el comando, argumentos para las opciones o algún tipo de entrada sobre la cual operará el comando. Las "opciones" también se denominan "indicadores", "conmutadores" o, más formalmente, "operadores". Cuando Bash intenta localizar un comando para su ejecución, los directorios que busca son los que aparecen en la $PATHvariable y el directorio de trabajo actual. [ 12 ]
$ # [POSICIÓN DEL COMANDO] [OPCIÓN] [ARGUMENTOS] $ # ,--^ ,------------^ ,----^ $ declare -p USER BASH_VERSION declare -x USER="liveuser" declare -- BASH_VERSION="5.2.37(1)-release"Usuarios y PS1
Se puede crear una cuenta de usuario tanto para una persona como para un programa. En los sistemas operativos tipo Unix, existen dos tipos de usuarios: "privilegiados" y "normales". Un usuario privilegiado, como el usuario root o el núcleo del sistema operativo, tiene permiso para realizar cualquier acción en la máquina. Los usuarios no privilegiados están sujetos a diversas limitaciones.
Cuando una sesión interactiva de shell espera la entrada del usuario, por defecto imprime una cadena de caracteres específica en la pantalla. En Bash, el valor de esta cadena de espera se almacena en la variable$PS1 de shell . Para los usuarios normales, un valor predeterminado común para $PS1es el carácter de dólar ( $ ). [ j ] Para el superusuario , un valor predeterminado común es el hash ( # ).
$ sudo --login --user root [sudo] contraseña para liveuser: # umask 077 # echo bob > /home/liveuser/names.txt # exit $ grep -e bob ./names.txt grep: ./names.txt: Permiso denegadoModos
paradigma de programación
Aunque la mayoría de los usuarios consideran la shell como un intérprete de comandos interactivo, en realidad es un lenguaje de programación en el que cada instrucción ejecuta un comando. Debido a que debe satisfacer tanto los aspectos interactivos como los de programación de la ejecución de comandos, es un lenguaje peculiar, moldeado tanto por la historia como por el diseño. [ 13 ]
Bash está escrito en C. Se puede aproximar un estilo modular mediante un buen estilo y un diseño cuidadoso. [ 14 ] A menudo se utiliza en un estilo imperativo o procedimental .
Modos interactivos y no interactivos
Como procesador de comandos , Bash puede operar en dos modos: interactivo o no interactivo. En el modo interactivo , los comandos se leen generalmente desde un emulador de terminal . En el modo no interactivo, que facilita la automatización , los comandos se leen generalmente desde archivos con nombre, conocidos hoy como scripts de shell . Cuando se ejecuta como un comando independiente en la interfaz de línea de comandos (CLI), por defecto Bash abre una nueva shell en modo interactivo.
Guiones
Los scripts de shell son archivos de texto que contienen código , a menudo comandos , destinados a ser leídos y ejecutados por un intérprete específico en un proceso por lotes, de forma no interactiva y sin interacción adicional del usuario. Los scripts interpretados son programas que no requieren la compilación de su código fuente : todo el código fuente relevante se encuentra dentro del propio script. Existen muchos programas que pueden funcionar como intérpretes de scripts: Perl , AWK , etc. Los scripts interpretados se escriben con mayor frecuencia para shells de Unix.
Los dos primeros caracteres de la primera línea de cualquier script de shell (ejecutable) comienzan con algo llamado shebang : literalmente los caracteres hash ( # ) y bang ( ! ) uno al lado del otro.
$ cat ./example.sh # ! /bin/env bash echo fooSi un script está destinado a ser ejecutado por un usuario como un programa independiente en la línea de comandos, entonces se le denomina "ejecutable" . Por convención, los nombres de archivo de los scripts de shell de Unix ejecutables se identifican con el sufijo .sh. El bit "execute" se puede habilitar en un script de shell con la utilidad chmod:
$ ls -l ./example.sh -rw-r--r--.1 liveuser liveuser 32 Aug 3 22:33 example.sh $ ./example.sh bash: ./example.sh: Permiso denegado $ chmod 0744 ./example.sh $ ls -l ./example.sh -rwxr--r--.1 liveuser liveuser 32 Aug 3 22:33 example.sh $ ./example.sh fooEl sourceincorporado
Con el comando source, o su sinónimo ., Bash lee y ejecuta comandos de shell desde cualquier archivo de texto por su nombre. [ k ]
Shells con y sin inicio de sesión
Bash puede ejecutarse como intérprete de comandos de inicio de sesión , o " líder de sesión ", tanto en modo interactivo como no interactivo mediante la --loginopción correspondiente. El inicio de sesión requiere autenticación de usuario . Por este motivo, solo existe un intérprete de comandos de inicio de sesión por sesión de usuario. En GNU/Linux, el intérprete de comandos de inicio de sesión de un usuario se identifica en el archivo /etc/passwd.
$ awk -F ':' '$1 ~ /root/' /etc/passwd root:x:0:0:Super User:/root:/bin/bashCuando un usuario humano inicia sesión, este procedimiento suele realizarse en una interfaz gráfica de usuario (GUI). Al abrir un emulador de terminal , este ejecuta una instancia del intérprete de comandos del usuario que no es de inicio de sesión.
Cerrar sesión en una sesión de shell desde un emulador de terminal se puede lograr con el comando exit o, por defecto en Bash, presionando + . Ctrld
sourceArchivos de inicio
Cuando Bash se inicia, utiliza sourcepara ejecutar comandos en una variedad de dotfiles (ver listas a continuación). [ 15 ] Estos dotfiles, a diferencia de los scripts de shell, normalmente no tienen habilitado el permiso de ejecución ni un hash-bang . Por defecto, Bash cargará un conjunto de archivos algo diferente, y en una secuencia diferente, dependiendo de: [ l ]
- Cómo se llama a Bash: de forma interactiva, no interactiva, invocado con nombre
sh - ¿Qué opciones se utilizan?:
--login,--rcfile,--norc,--posix - ¿Qué variables de entorno están definidas:
BASH_ENV,ENV, y - ¿Qué archivos existen?
/etc/profile~/.bash_profile~/.bash_login~/.profile~/.bash_logout, y~/.bashrcentre otros.
Por supuesto, cualquier archivo de inicio también puede ejecutar comandos de cualquier otro archivo. Los archivos de inicio pueden afectar el comportamiento del shell, los emuladores de terminal, el sistema de ventanas X y el gestor de ventanas .
Modo POSIX
El estándar POSIX IEEE 1003.1 especifica un conjunto común de definiciones al que puede ajustarse cualquier aplicación de sistema de shell (bash, dash , zsh , etc.). Cualquier script de usuario de shell ./myscript.shescrito de conformidad con las directrices POSIX debería ser ejecutable por cualquier aplicación de sistema de shell que haya implementado la especificación POSIX. En consecuencia, se puede esperar razonablemente que los scripts compatibles con POSIX se ejecuten correctamente en cualquier sistema operativo Unix o similar que implemente el estándar POSIX ( Linux , OpenBSD , Oracle Linux , HP-UX , etc.). Estos scripts se consideran " portátiles " tal como están y sin modificaciones adicionales. La parte de POSIX que se aplica a los shells y las utilidades de línea de comandos es un subconjunto de un grupo más amplio de estándares POSIX que especifican con mayor detalle cómo deben funcionar los terminales y los emuladores de terminal para que también se consideren portátiles.
Cuando Bash funciona en modo POSIX, dispone de menos funciones, pero el código resultante se puede ejecutar en una mayor variedad de sistemas operativos.
Para habilitar el modo POSIX al inicializar un shell interactivo, Bash se puede ejecutar como sh, bash --posixo bash -o posix. [ m ]
Para que un script se inicialice en modo POSIX, se usaría el hashbang #!/usr/bin/env sho el menos portable #!/bin/sh. Cuando una instancia de Bash está operando en modo POSIX, $POSIXLY_CORRECTse define la variable de entorno y el valor de la variable de entorno SHELLOPTSincluye la cadena posix .
$ declare -p POSIXLY_CORRECT SHLVL bash: declare: POSIXLY_CORRECT: no encontrado declare -x SHLVL="1" $ bash -o posix $ declare -p POSIXLY_CORRECT SHLVL declare -- POSIXLY_CORRECT="y" declare -x SHLVL="2"La lista completa de características disponibles en Bash que no están especificadas por POSIX es considerable. [ 17 ] Aquí hay una lista parcial:
- Cualquier matriz que no sea la matriz de parámetros posicionales,
$@, no es POSIX - La construcción de prueba extendida de doble corchete,
[[...]], no es POSIX[...]ytestson POSIX
- Una de las sintaxis de evaluación aritmética con paréntesis dobles,
((...)), no es POSIX$((...))es POSIX
- La expansión de llaves
kernel{,-headers}no es POSIX. - El alcance dinámico de los parámetros y la
localfunción integrada no son POSIX. - La sustitución de procesos
<(...)no es POSIX. - Ciertas operaciones de manipulación de cadenas en expansiones de parámetros no son POSIX.
- La mayoría de los comandos integrados de Bash no son POSIX.
- El comando imprime la lista de funciones integradas especiales de Bourne, que son POSIX
enable-s$ enable -s | wc --lines 16 $ enable | wc --lines 61
- El
enablepropio sistema integrado no es POSIX. - En Bash, en modo no POSIX, los builtins
.ysourceson sinónimos.- El
.operador integrado (es decir, 'punto') es POSIX, sin embargo - El
sourcesistema integrado no es POSIX.
- El
- El comando imprime la lista de funciones integradas especiales de Bourne, que son POSIX
- Las variables de shell
$EPOCHSECONDSy$EPOCHREALTIMEno son POSIX
Los comandos del sistema disponibles en los sistemas operativos modernos tipo Unix, y que también están especificados por POSIX, pueden tener menos opciones o menos variables de entorno relevantes disponibles bajo POSIX. La mayoría (como ls) son programas independientes en los directorios /bin, /usr/bin, /sbino /usr/sbin(en Linux, generalmente proporcionados por GNU coreutils o BusyBox ) en lugar de funciones integradas de Bash.
Debido a estas y otras diferencias, los scripts de shell Bash modernos (versión 5) rara vez se pueden ejecutar "tal cual" con los intérpretes de shell Bourne o Korn (versión anterior). La creación de scripts pensando en la portabilidad es cada vez menos común a medida que GNU/Linux se generaliza.
El código que tiene sintaxis válida en Bash pero no está especificado por POSIX se denomina "bashismo". El programa checkbashismsse puede utilizar para asegurar que un script se pueda ejecutar en Debian Linux sin errores de portabilidad. [ 18 ]shellcheck El linter estático de Vidar Holen , escrito en Haskell , puede analizar la sintaxis de un script para comprobar su compatibilidad con bash, dash, ksh y Bourne sh. [ 19 ]
Los requisitos de sintaxis para cada shell son ligeramente diferentes. Por ejemplo, la política de Debian permite algunas extensiones en sus scripts (como en el shell dash ), [ 20 ] mientras que un script destinado a admitir shells Bourne pre-POSIX, como configure de autoconf , está aún más limitado en las características que puede usar. [ 21 ]
Otros modos
Modo restringido
Un intérprete de comandos restringido se utiliza para configurar un entorno más controlado que el intérprete de comandos estándar. Un intérprete de comandos restringido se comporta de forma idéntica a bash, con la excepción de que numerosas acciones están prohibidas o no se realizan, entre ellas:
- Cambiar directorios con la
cdfunción integrada. - Establecer o eliminar los valores de las variables
SHELL,PATH,HISTFILE,ENV, oBASH_ENV. - Especificar nombres de comandos que contengan barras diagonales en la interfaz de línea de comandos (CLI).
- Utilizar rutas de acceso absolutas como argumentos para los comandos
.,history, o .hash-p - Especificar una búsqueda de ruta con
. -po .command-p - Importar definiciones de funciones y analizar el valor del
SHELLOPTSentorno de shell al iniciar. - Redirección de la salida mediante los operadores de redirección
>,>,<>,>&,&>, y>>. - Utilizar el
execcomando integrado para reemplazar el intérprete de comandos con otro comando. - Modificar las funciones integradas del shell.
Una vez activado el modo restringido, no se puede desactivar. Estas restricciones se aplican tras la lectura de cualquier archivo de inicio y no afectan a los scripts de shell. El modo restringido se utiliza con poca frecuencia.
Modo privilegiado
En Bash, el "modo privilegiado" es una opción poco utilizada heredada del shell SVR4.2 UNIX System V (alrededor de 1992). [ n ] Se puede habilitar con y deshabilitar con . [ p ]set-pset+p
Cuando se habilita el modo privilegiado, las SHELLOPTSvariables de shell incluyen la cadena "privileged".
Modo de depuración extendido
Se habilita mediante bash --debuggerla invocación o mediante durante los modos interactivo o no interactivo. Utiliza un programa independiente llamado bashdb . [ 22 ] extdebug no está disponible en modo POSIX. Consulte la documentación para obtener más información. Consulte también § Depuración .shopt-sextdebug
Modos de compatibilidad
Bash 4.0 introdujo el concepto de nivel de compatibilidad de shell, especificado como un conjunto de opciones para el comando integrado shopt (compat31, compat32, compat40, compat41, etc.). Actualmente solo existe un nivel de compatibilidad; cada opción es mutuamente excluyente. El nivel de compatibilidad permite a los usuarios seleccionar comportamientos de versiones anteriores que son incompatibles con versiones más recientes mientras migran sus scripts para usar las características y el comportamiento actuales. Se trata de una solución temporal. [ q ]
— Manual de referencia de GNU Bash
Observabilidad
La opción xtrace
Cuando xtrace está habilitado, se imprime contenido de depuración simple en la terminal. Se puede habilitar con o , y deshabilitar con , o . Estas opciones también se aceptan en la línea de comandos y en hash-bangs: , etc.set -o xtraceset -xset +o xtraceset +xset -#!/bin/bash -x
$ bash -x $ echo $(( 2 + 2 )) + echo 4 4 $ set -- 1 2 3 + set -- 1 2 3 $ printf '<%s>\n' " $@ " + printf '<%s>\n' 1 2 3 <1> <2> <3>La configuración del shell xtrace está especificada por POSIX. Véase también § Depuración .
La opción detallada
La opción verbose imprime las cadenas en la terminal a medida que se leen, y antes de que se realicen expansiones. Se usa raramente. [ r ]
Comentarios
Los comentarios pueden ser una valiosa forma de aclarar información o explicar un script o archivo fuente a otra persona que quizás no esté familiarizada con las intenciones o el contexto del programador.
Los comentarios estándar en Bash se indican con el carácter de almohadilla: # . Cualquier texto a la derecha de la almohadilla hasta el final de la línea será ignorado. Se permiten comentarios en línea, pero los comentarios con almohadilla no se imprimirán durante la depuración. Véase también: § xtrace .
Los comentarios marcados con dos puntos, : , se originaron en el intérprete de comandos Thompson . Cualquier argumento a la derecha de los dos puntos : builtin se ignora. No se permiten comentarios en línea, pero los comentarios con dos puntos se imprimirán durante la depuración y cualquier parámetro se habrá expandido. [ s ]
$ # Definir foo $ foo = bar # Un comentario hash en línea aparece en la misma línea que un comando $ set -x $ # Un comentario normal (sin salida) $ : " ${ foo } " + : bar
Códigos de salida
Cuando bash ejecuta comandos, se generan códigos de estado de salida$? , también llamados "códigos de retorno", que pueden ofrecer información sobre cómo finalizó la ejecución de un programa. El valor del código de salida capturado más recientemente se almacena en el parámetro de shell 'signo de interrogación:' . En contextos no aritméticos (es decir, la mayoría de las veces), el valor numérico o booleano de "verdadero" es cero (0) y el de "falso" es uno (1).
Cuando se ejecuta un comando del sistema, el significado previsto de su estado de salida se puede encontrar con mayor frecuencia en su página de manual; por lo general, un cero indica éxito y un estado de salida distinto de cero indica algún tipo de condición de fallo o éxito parcial. pinges un comando bien conocido con tres códigos de salida significativos: 0, 1 y 2.
En Bash, dentro de los contextos aritméticos, los valores numéricos de verdad se invierten: "verdadero" es uno y "falso" es cero. Un contexto aritmético generalmente se identifica mediante la sintaxis ((...))o $((...)). Si una instrucción aritmética se evalúa como cero, se considera "verdadera" y el código de salida es uno. Si la instrucción se evalúa como cualquier número distinto de cero, la instrucción aritmética es "falsa" y el código de salida es cero.
No todos los comandos de Linux/UNIX proporcionan códigos de salida significativos más allá de cero y uno, y no existe un sistema estándar para la definición de códigos de salida en Linux.
$ true ; echo $? # El código de salida significa "verdadero" 0 $ false ; echo $? ; echo # El código de salida significa "falso" 1 $ $ bash -c 'exit 99' ; printf 'código de salida: %d\n' $? exit-code: 99 $ (( 1 - 1 )) ; printf '%d\n' $? # Este código de salida significa "verdadero" 1 $ (( 1 + 1 )) ; printf '%d\n' $? # ...y este código de salida significa "falso" 0
Control de trabajo
El intérprete de comandos Bash tiene dos modos de ejecución: por lotes (asíncrono) y concurrente (síncrono). Para ejecutar comandos en modo por lotes (es decir, en secuencia), deben estar separados por el carácter ; o en líneas separadas:
$ comando1 ; comando2 $ comando3
En este ejemplo, cuando el comando1 finaliza, se ejecuta el comando2 , y cuando el comando2 se completa, se ejecuta el comando3 . La ejecución en segundo plano del comando1 puede ocurrir usando el símbolo & al final de un comando de ejecución; el proceso se ejecutará en segundo plano, devolviendo inmediatamente el control al intérprete de comandos y permitiendo la ejecución continua de otros comandos.
$ comando1 y
O para tener una ejecución concurrente de command1 y command2 , deben ejecutarse en el intérprete de comandos Bash de la siguiente manera:
$ comando1 y comando2
En este caso, el comando1 se ejecuta en segundo plano, y el símbolo & devuelve el control inmediato al intérprete de comandos que ejecuta el comando2 en primer plano. Un proceso puede detenerse y el control puede devolverse a bash escribiendo + mientras el proceso se está ejecutando en primer plano. [ t ] Se puede obtener una lista de todos los procesos, tanto en segundo plano como detenidos, ejecutando jobs :Ctrlz
$ trabajos [1]- Ejecutando comando1 y
En la salida, el número entre corchetes se refiere al ID del trabajo. El signo más indica el proceso predeterminado para bg y fg . Los textos "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 mediante varios comandos. El comando `fg` trae un proceso al primer plano, mientras que `bg` ejecuta un proceso detenido en segundo plano. Tanto `bg` como `fg` pueden aceptar un ID de trabajo como primer argumento para especificar el proceso sobre el que actuar. Si no se especifica, 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 de trabajo debe especificarse después de un signo de porcentaje.
$ dormir 100 & [1] 4904 $ matar %1 $ trabajos [1]+ Terminados dormir 100
El control de trabajos, también conocido como "modo monitor", está habilitado de forma predeterminada en los shells interactivos y se puede deshabilitar con .set+m
Señales
La señalización es un medio de comunicación entre procesos (IPC). En ocasiones, un proceso de línea de comandos puede parecer que se congela a mitad de su ejecución. En estos casos, puede ser necesario identificar qué proceso está bloqueado y finalizarlo manualmente.
En una terminal interactiva, normalmente basta con pulsar + para finalizar el proceso en primer plano y devolver el control al indicador de usuario, o pulsar + para suspenderlo. En ocasiones, suspender un proceso tendrá éxito cuando los intentos de cancelarlo parezcan no responder. En otros casos, puede ser necesario usar el programa kill para enviar una señal IPC. En este ejemplo, usamos el comando kill desde una segunda pantalla de terminal para finalizar el proceso con PID 4331. Ctrlc Ctrlz
$ tty # Terminal uno /dev/pts/0 $ whoami liveuser $ sleep 1000 # El comando se queda colgado
$ tty # Terminal dos /dev/pts/1 $ whoami liveuser $ ps aux | grep -e sleep -e PID USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND liveuser 4331 0.0 0.0 230336 2312 pts/1 S+ 11:19 0:00 sleep 1000 liveuser 4333 0.0 0.0 231248 2516 pts/0 S+ 11:19 0:00 grep --color=auto -e sleep -e PID $ kill 4331 $ ps aux | grep -e sleep -e PID # El proceso sleep ha terminado USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND liveuser 4333 0.0 0.0 231248 2516 pts/0 S+ 11:19 0:00 grep --color=auto -e sleep -e PID
$ tty # Terminal una vez más /dev/pts/0 $ whoami liveuser $ sleep 1000 Terminado
En los sistemas operativos tipo Unix, un usuario puede indicarle al núcleo que envíe una señal a un proceso de su propiedad. Un usuario normal no puede enviar una señal a un proceso con privilegios. Las señales se pueden enviar a un proceso mediante el comando interno `kill` o mediante el binario del sistema del mismo nombre.
$ whoami liveuser $ ps aux | awk '$2 == "1"' # Veamos información sobre el proceso del kernel, proceso 1. root 1 0.0 0.2 37140 20440 ? Ss 04:44 0:18 /usr/lib/systemd/systemd --switched-root --system --deserialize=53 rhgb $ kill -s SIGKILL 1 bash: kill: (1) - Operación no permitida $ type -a kill kill es un comando integrado del shell kill es /usr/bin/kill $ /usr/bin/kill -s SIGKILL 1 kill: error al enviar la señal a 1: Operación no permitida
Las señales más utilizadas se pueden ver con kill -L | head -n 4. Cada señal IPC está asociada a un número de señal, pero los códigos de salida y los códigos de señal son dos cosas distintas. Si bien enviar a un proceso una señal IPC de 9 (una señal "KILL") casi con certeza terminará el proceso de inmediato, lo más probable es que no resulte en que el proceso devuelva un código de salida de 9.
Por defecto en Bash, el comando kill integrado envía una señal TERM ("terminar"). Es común que las utilidades de línea de comandos respondan a una SIGTERM cerrándose y saliendo limpiamente. (TERM y SIGTERM son lo mismo, el prefijo SIG- a todos los nombres de señales se puede omitir). La secuencia + en Bash envía una señal SIGINT , señal de interrupción, al proceso en primer plano. La secuencia + envía la señal SIGSTOP , señal de parada. [ u ] Cuando un proceso recibe una SIGKILL , el proceso termina inmediatamente y de forma desordenada. Se recomienda usar SIGKILL solo como último recurso. [ 23 ] La señal SIGKILL no se puede bloquear ni manejar.CtrlcCtrlz
Los procesos pueden "capturar" y "manejar" las señales IPC que reciben. Un usuario puede usar el comando interno kill para "enviar" una señal IPC a otro proceso. Ese proceso objetivo puede establecer un mecanismo, un plan previo, sobre cómo responder cuando reciba o "capture" una señal en particular. La forma en que un programa objetivo responde se denomina cómo el programa "maneja" la recepción de la señal. En las páginas man se puede ver cómo algunos comandos del sistema imprimen cierta información en la terminal cuando reciben una señal SIGHUP ; por ejemplo, el comando dd . [ 24 ]
Cuando bash es interactivo, en ausencia de cualquier interrupción, ignora SIGTERM (para que no termine un shell interactivo) y captura y maneja SIGINT (para que el comando interno wait sea interrumpible). Cuando bash recibe SIGINT , sale de cualquier bucle en ejecución. En todos los casos, bash ignora SIGQUIT . Si el control de trabajos está activo, bash ignora SIGTTIN , SIGTTOU y SIGTSTP . [ 25 ]
kill0
— bash(1)
Por defecto, los scripts de shell Bash reciben y responden a todas y cada una de las señales IPC que se les envían; sin embargo, los scripts Bash pueden utilizar la función integrada trap para capturar y manejar señales. [ 26 ]
$ cat ./trap-example.sh # ! /usr/bin/env bash trap umask EXIT echo bar exit 0 $ chmod 0700 trap-example.sh $ ./trap-example.sh bar 0077
Existen algunas señales que solo están disponibles dentro de Bash como extensiones de GNU: ERR , EXIT , RETURN y DEBUG . Estas señales pueden ser útiles para la depuración y solo pueden ser enviadas y manejadas por comandos integrados del shell. Véase también § Depuración .
Valores de los parámetros
Hay muchas implementaciones diferentes de echo . Algunas tienen la opción y otras no. [ v ] La lista de opciones no es uniforme en todas las implementaciones, aunque tanto echo como printf están especificados por POSIX. Si un programador desea conocer el valor preciso de una cadena contenida en una variable, la forma más consistente de hacerlo es usar printf .-e
Para cualquier cadena que contenga cualquier carácter (¿aparte de nulo?), incluidos los dígitos, el especificador de formato es %s .
$ foo = abc bar = 123 $ printf '<%s>\n' " ${ foo } " " ${ bar } " <abc> <123>
Para dígitos únicamente, el especificador de formato es %d .
$ printf '<%d>\n' " ${ foo } " " ${ bar } " bash: printf: abc: número no válido <0> <123>
Con printf , nunca se incluye un salto de línea en la salida a menos que el programador lo incluya en la cadena de formato. En el ejemplo siguiente, donde se ha omitido un salto de línea en la cadena de formato, el valor de PS1 se imprime en la misma línea que la salida del comando anterior.
$ printf '<%s>' " ${ foo } " " ${ bar } " <abc><123>$
Otro método muy consistente es usar . La salida de se puede reutilizar como entrada. Sin embargo, no todas las variables y parámetros se pueden imprimir usando , por ejemplo, los valores de los Parámetros especiales. El hashtag de Parámetro especial, , informa cuántos Parámetros posicionales están definidos actualmente.declare-pdeclare-pdeclare-p"$#"
$ declare -p foo bar declare -- foo="abc" declare -- bar="123" $ set -- $ declare -p " $# " bash: declare: 0: no se encontró
Para ver una cadena completa de entrada en una consola interactiva...
$ declarar -p #
...el hashtag sería interpretado por Bash como un comentario en línea. Con el comentario y todo el texto a su derecha eliminados, el comando que Bash ejecutaría sería . Este comando, según , "mostraría los valores y atributos de cada NOMBRE", es decir, cada variable, y, "si no se dan NOMBRES, mostraría los valores y atributos y valores de todas las variables", lo que puede ser más de 100 líneas de salida.declare-phelp declare
Por otro lado, printf no puede mostrar los atributos de las variables. Véase también § Depuración .
$ readonly foo $ declare -p foo declare -r foo="abc" $ printf '<%s>' " ${ foo } " <abc>$
Ambiente
Entorno(s) de ejecución configurable(s): [ w ]
- Archivos de inicio de sesión y de shell como
~/.bashrcy~/.profile(es decir, archivos de puntos ); - Configuración ( set built-in ) y opciones de shell ( shopt built-in ) que alteran el comportamiento del shell;
Archivos de inicio de sesión y de shell (también conocidos como "archivos ocultos")
Cuando Bash se inicia, ejecuta los comandos en una variedad de archivos de punto . [ 15 ] A diferencia de los scripts de shell de Bash, los archivos de punto 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 versiones anteriores
El siguiente ejemplo ~/.bash_profilees compatible con el shell Bourne y proporciona una semántica similar a la de csh para ~/.bashrcy ~/.bash_login. La es una evaluación de cortocircuito que comprueba si el nombre del archivo existe y es legible, omitiendo la parte posterior a si no lo es.[ -r filename ] && cmd&&
[ -r ~/.profile ] && ~/.profile # Configurar el entorno, una sola vez, solo sintaxis Bourne-sh if [ -n " $PS1 " ] ; then # ¿Somos interactivos? [ -r ~/.bashrc ] && ~/.bashrc # Configuración de tty/prompt/función para shells interactivos [ -r ~/.bash_login ] && ~/.bash_login # Cualquier tarea de inicio de sesión solo para el shell de inicio de sesión fi # Fin del bloque "if"
- Problemas del sistema operativo al iniciar Bash
Algunas versiones de Unix y Linux contienen scripts de inicio del sistema Bash, generalmente en el /etcdirectorio. Bash ejecuta estos archivos como parte de su inicialización estándar, pero otros archivos de inicio pueden leerlos en un orden diferente a la secuencia de inicio de Bash documentada. 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 configurarse. Los scripts de inicio que inician el sistema de ventanas X también pueden hacer cosas inesperadas con los scripts de inicio de Bash del usuario en un intento de configurar las variables de entorno del usuario antes de iniciar el gestor de ventanas . Estos problemas a menudo se pueden solucionar usando un archivo ~/.xsessiono ~/.xprofilepara leer el ~/.profile— que proporciona las variables de entorno que necesitan las ventanas de shell Bash generadas desde el gestor de ventanas, como xterm o Gnome Terminal .
Flujos estándar
Flujos estándar : STDIN, STDOUT y STDERR
Comandos
Comandos del sistema
Alias
Los alias permiten sustituir una cadena por una palabra que se encuentra en una posición en la entrada donde puede ser la primera palabra de un comando simple. Los alias tienen nombres y valores correspondientes que se establecen y eliminan mediante los comandos integrados alias y unalias. [ x ]
— Manual de referencia de GNU Bash
Palabras clave y palabras reservadas
function- Las declaraciones de funciones de Bash que incluyen esta palabra clave en particular no son compatibles con los scripts Bourne/Korn/POSIX; sin embargo, Bash sí acepta la sintaxis de declaración de funciones utilizada por los shells compatibles con Bourne, Korn y POSIX.
Funciones
Las funciones de shell son una forma de agrupar comandos para su posterior ejecución utilizando un único nombre para el grupo. Se ejecutan como un comando simple "normal". Cuando se utiliza el nombre de una función de shell como nombre de comando simple, el shell ejecuta la lista de comandos asociados con ese nombre de función. Las funciones de shell se ejecutan en el contexto actual del shell; no se crea ningún proceso nuevo para interpretarlas. [ y ]
— Manual de referencia de GNU Bash
Comandos integrados
- Varios comandos integrados:
- Funciones integradas especiales POSIX: [ z ]
- cd , pwd , etc.
- conjunto [ o ]
- Xtrace: [ | ]. El principal método de depuración del intérprete de comandos. Tanto xtrace como verbose se pueden desactivar simultáneamente con el comando .
set-xset-oxtraceset- - Detallado: [ | ]. Imprime un comando en la terminal mientras Bash lo lee. Bash lee las construcciones de una sola vez, como los comandos compuestos que incluyen bloques if-fi y case-esac. Si se incluye un dentro de un comando compuesto, entonces "detallado" se habilitará la próxima vez que Bash lea código como entrada, es decir, después del final de la construcción que se está ejecutando actualmente. [ 27 ]
set-vset-overboseset-v - Tanto xtrace como verbose se pueden desactivar al mismo tiempo con el comando .
set-
- Xtrace: [ | ]. El principal método de depuración del intérprete de comandos. Tanto xtrace como verbose se pueden desactivar simultáneamente con el comando .
- tienda [ 28 ]
- expand-aliases: Activado por defecto en shells interactivos. Algunos desarrolladores desaconsejan su uso en scripts.
- Funciones integradas especiales POSIX: [ z ]
Ruta y comandos del sistema
Cuando el intérprete de comandos busca comandos externos, se basa en la variable de entorno Bourne $PATH. Esta variable $PATHcontiene una lista de directorios separados por dos puntos :. Comenzando por el directorio más a la izquierda y seleccionando directorios de izquierda a derecha, se busca en cada directorio hasta encontrar una coincidencia. En Linux, para que un usuario pueda localizar comandos adicionales, es práctica común que los administradores de distribución y los desarrolladores de paquetes modifiquen el valor de la variable del usuario final $PATHincluyendo archivos fuente en /etc/profile.dy otras ubicaciones.
Al buscar el comando, chmodpor ejemplo, después de considerar los comandos internos y no encontrar nada, Bash buscará en los directorios en $PATHy seleccionará la ruta absoluta del primer ejecutable encontrado que tenga un nombre base que coincida con la cadena de búsqueda. [ 12 ]
Si hay más de un comando echodisponible en los directorios listados en $PATH, durante el proceso de análisis y ejecución de una línea de comandos, por defecto solo se seleccionará el primer comando encontrado. $PATHLas búsquedas son lentas. El intérprete de comandos acelera el proceso de ejecución de la línea de comandos al recordar las ubicaciones de los comandos en una tabla hash. Para realizar una $PATHbúsqueda completa sin ninguna interferencia de la tabla hash, elimine la tabla actual con y busque todo tipo de comandos con .hash-rtype-a
$ # Forzar una búsqueda de ruta completa $ PATH = ${ PATH } : ${ HOME } $ printf 'echo script_file: "$@"\n' > ./echo $ chmod 0700 ./echo $ hash -r ; type -a echo echo es un comando integrado del shell echo es /usr/bin/echo echo es /home/liveuser/echo
Para ejecutar una línea de comandos con un comando que se encuentre más adelante en la $PATHcadena, puede especificar una ruta absoluta o puede establecer la resolución de la ruta en relación con el directorio de trabajo actual.
$ /home/liveuser/echo foo script_file: foo $ ./echo bar script_file: bar
Por motivos de seguridad, es recomendable asegurarse de que los directorios incluidos en PATH no tengan permisos de escritura para todos los usuarios, o que solo tengan permisos de escritura para el usuario root y los usuarios de confianza.
Búsqueda de comandos
- Posición del comando: después de las expansiones, la primera palabra del texto completo de la línea de comandos.
- La búsqueda del nombre del comando se realiza en el siguiente orden:
- Comandos internos del intérprete de comandos :
- Alias de shell ,
- Palabras reservadas de Shell,
- Funciones de shell y
- Comandos integrados del shell ;
- Comandos externos al intérprete de comandos, utilizando la variable de entorno PATH:
- Comandos internos del intérprete de comandos :
Estructuras de control
Subcapas
Subcapas : (...);
oleoductos
Sin embargo, al utilizar una tubería, pueden realizar múltiples ciclos de computación al mismo tiempo, aumentando sustancialmente su velocidad. En una unidad de control con tubería, diferentes instrucciones pasan simultáneamente por el proceso, pero en diferentes puntos. Mientras se busca una instrucción, se decodifica una segunda, y así sucesivamente. Tuberías al estilo Unix : |.
Operadores lógicos
- Y (
&&) - O (
||) - NO (
!)
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 "Ocurrió un error" > & 2Donde ./do_somethingsolo 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 cd o el comando devuelven un "error" (estado de salida distinto de cero)../do_something
Iteración
ITERACIÓN: A veces, los programas se repiten indefinidamente o hasta que se alcanza un resultado específico. Cada ejecución de las instrucciones es una "iteración". [ 29 ]
- mientras , hasta y seleccionar comandos compuestos de bucle;
- Comandos compuestos de bucle for con enumeración de listas y estilo aritmético C ; y
- comandos de control de flujo continue , break , return y exit ;
comandos compuestos
compuesto: algo formado por la unión de elementos o partes. [ 30 ]
— Diccionario Colegiado Merriam-Webster
Bash también admite formas de evaluación de comandos condicionales. [ ab ]if...ficase...esac
Pruebas
Comandos integrados para probar atributos de archivo, comparar valores de cadena y enteros, etc.:
- Comando de prueba tradicional ,
- Prueba tradicional de un solo soporte:
[, - Prueba moderna de doble soporte: , que incluye características avanzadas:
[[...]]- Expresiones regulares extendidas y coincidencia de extglob
- Comparaciones lexicográficas con
<y>;
((...))evaluación y prueba numérica; esto incluye casi todos los operadores del lenguaje "C" para comparación aritmética y numérica;
Para todos los comandos, el estado de salida se almacena en la variable especial $?.
Expresiones regulares
Bash 3.0 admite la coincidencia de expresiones regulares dentro del proceso utilizando una sintaxis que recuerda a Perl . [ 32 ] La coincidencia de expresiones regulares se limita a las cadenas en el lado derecho del =~operador en la [[..]]construcción de prueba extendida. [ ac ]
[[${line}=~[[:space:]]*(a)?b]]significa que los valores de línea como 'aab', 'aaaaaab', 'xaby' y 'ab' coincidirán, al igual que una línea que contenga una 'b' en cualquier parte de su valor.
coprocesos
Un coproceso es un comando de shell precedido por la palabra reservada `coproc`. Un coproceso se ejecuta de forma asíncrona en un subshell, como si el comando hubiera terminado con el operador de control `&`, estableciéndose una tubería bidireccional entre el shell ejecutor y el coproceso. [ ad ]
— Manual de referencia de GNU Bash
Manipulación de datos
División de palabras
Dividir en palabras (es decir, dividir palabras )
Citar
En caso de duda, ¡cita! [ 33 ]
— Dominando la programación de scripts de shell de Linux, por Andrew Mallett
Bash tiene ciertas reglas de citación : usos de
- comillas simples
'...' - comillas dobles
"..." - barras invertidas
\y - Citas ANSI-C
$'...'.
Véase también § Localidades ,$"..."
Véase también las comillas invertidas `...`: § Sintaxis obsoleta .
Unicode
Compatibilidad con Unicode y con el uso de comillas ANSI-C.echo-e
Expansión de refuerzo
$ echo kernel { ,-headers } kernel kernel-headers
La expansión de llaves, también llamada alternancia, es una característica copiada del intérprete de comandos C. Genera un conjunto de combinaciones alternativas. [ ae ] Los resultados generados no tienen por qué existir como archivos. Los resultados de cada cadena expandida no están ordenados y se conserva el orden de izquierda a derecha:
$ echo a { p,c,d,b } e ape 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 intérprete de comandos Bourne no produce la misma salida.
$ # shell bash $ /bin/bash -c 'echo a{p,c,d,b}e' ape ace ade abe $ # Un shell 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, primero se expanden las llaves y luego se sustituyen los comodines resultantes de forma normal. Por lo tanto, se podría obtener una lista de imágenes JPEG y PNG en el directorio actual utilizando:
ls *. { 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 son posibles las llaves dentro de las llaves.
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 usar un tercer entero para especificar el incremento.
$ echo { 1 ..10 } 1 2 3 4 5 6 7 8 9 10 $ echo { 01 ..10 } 01 02 03 04 05 06 07 08 09 10 $ echo file { 1 ..4 } .txt file1.txt file2.txt file3.txt file4.txt $ echo { a..e } abcde $ echo { 1 ..10..3 } 1 4 7 10 $ echo { a..j..3 } adgj
Cuando la expansión de llaves se combina con la expansión de variables (también conocida como expansión de parámetros y sustitución de parámetros ), la expansión de variables se realiza después de la expansión de llaves, lo que en algunos casos puede requerir el uso de la función integrada eval , por lo tanto:
$ inicio = 1 ; fin = 10 $ echo { $inicio .. $fin } # falla la expansión debido al orden de evaluación {1..10} $ eval echo { $inicio .. $fin } # ocurre la expansión de la variable y luego se evalúa la cadena resultante 1 2 3 4 5 6 7 8 9 10
Expansión de tilde
Expansión de parámetros y variables
- Tipo
- Parámetros de la carcasa
- Variables ambientales
- Variables de usuario
- Alcance
- Matrices
- Matrices indexadas : el tamaño es ilimitado.
- Matrices asociativas : vía . En febrero de 2009, Bash 4.0 introdujo soporte para matrices asociativas . Los índices de las matrices asociativas son cadenas, de manera similar a AWK o Tcl . Se pueden usar para emular matrices multidimensionales. [ h ]
declare-A
- Expansión de parámetros
- Sintaxis de expansión que pueden realizar algunas tareas más rápidamente que las utilidades externas, incluyendo, entre otras:
- Sustitución de patrones
${foo//x/y}para ,sed 's/x/y/g'
- Eliminar patrón de prefijo o sufijo coincidente
${bar##[a-zA-Z0-9]*}paracut -c8-,
- Enumerar las claves de la matriz
${!array[@]}, y
- Mostrar error si es nulo o no está configurado.
${var:?error message},
Expansión de ruta de acceso
Expansión de ruta de acceso, es decir, comodines y coincidencia de patrones al estilo shell usando *, ?, [...]. [ af ]
Localidades
Traducción específica del idioma mediante $"..."sintaxis de comillas. [ ag ]
Redireccionamientos de procesos y análisis sintáctico
Sustitución de comandos
Sustitución de comandos : ,$(...)
Sustitución de procesos
Sustitución de procesos , o , cuando un sistema lo admite:<()>()
Bash admite la sustitución de procesos mediante la sintaxis `and` , 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 tuberías sin nombre `/proc/fd/` en sistemas que lo admiten, o mediante tuberías temporales con nombre cuando sea necesario).<(command)>(command)
Expansión aritmética
Expansión aritmética, ((...))o , incluyendo$((...))
- Aritmética de enteros en cualquier base de dos a sesenta y cuatro, aunque
- La aritmética de punto flotante no está disponible dentro del propio shell (para esta funcionalidad, consulte las versiones actuales de bc y awk , entre otras).
Bash puede realizar cálculos con números enteros ("evaluación aritmética") sin necesidad de crear procesos externos. Para ello, utiliza el ((...))comando y la sintaxis de variables.$((...))
Redirección
Se realizan redirecciones de los flujos de datos de entrada estándar, salida estándar y error estándar , incluyendo:
- Escritura de archivos
>, y adición>>, - Aquí documentos ,
<<, - Aquí cadenas,
<<<, que permiten que los parámetros se utilicen como entrada, y - Un operador de redirección,
>|que puede forzar la sobrescritura de un archivo cuando la configuración noclobber de un shell está habilitada;
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 usando el &>operador. Esto es más sencillo de escribir que el equivalente de Bourne shell ' '. Bash admite documentos aquí . Desde la versión 2.05b, Bash puede redirigir la entrada estándar (stdin) desde una "cadena aquí" usando el operador.command>file2>&1<<<
Análisis de comandos
- Los comentarios se ignoran, desde un símbolo sin comillas
#(hash) hasta el final de la misma línea; [ 34 ] [ 35 ] - Los comandos se analizan línea por línea:
- Las estructuras de control se respetan y
- Las secuencias de escape con barra invertida
\también se respetan al final de las líneas;
- Dividir en palabras (es decir, división de palabras ) según las reglas de citación ,
- Incluyendo la citación ANSI-C
$'...';
- Incluyendo la citación ANSI-C
- En la cadena resultante se realizan siete tipos de expansiones en el siguiente orden:
- (Tipo 1) Expansión de refuerzo
kernel{-headers}, - (Tipo 2) Expansión de tilde
~, - De izquierda a derecha:
- (Tipo 3) Expansión de parámetros y variables
$fooo , incluyendo${bar} - (Tipo 4) Sustitución de comandos : ,
$(...) - (Tipo 5) Sustitución de procesos , o , cuando un sistema lo admite:
<()>() - (Tipo 6) Expansión aritmética,
((...))o , incluyendo$((...))- Aritmética de enteros en cualquier base de dos a sesenta y cuatro, aunque
- La aritmética de punto flotante no está disponible dentro del propio shell. [ ah ]
- (Tipo 3) Expansión de parámetros y variables
- División de palabras (de nuevo),
- (Tipo 7) Expansión de ruta de acceso, es decir, comodines y coincidencia de patrones al estilo shell usando
*,?,[...], [ af ] - Eliminación de la cotización ;
- (Tipo 1) Expansión de refuerzo
- Se realizan redirecciones de los flujos de datos de entrada estándar, salida estándar y error estándar . Véase también la sección « Redireccionamiento» más arriba.
- Se realiza la búsqueda del nombre del comando. Véase también § Búsqueda de comandos , más arriba.
- La cadena resultante se ejecuta como un comando.
Funciones exclusivamente interactivas
Historial de comandos
Historial de comandos de tamaño ilimitado . Esta función solo está disponible en modo interactivo. [ ai ]
Pila de directorios
La función de pila de directorios ( pushdypopd funciones integradas) solo está disponible en modo interactivo.
Finalización programable
También conocido como "autocompletado de tabulación" o " autocompletado de línea de comandos ", cuando un usuario presiona la tecla Tab en una consola interactiva, Bash utiliza automáticamente cualquier script de autocompletado disponible para sugerir nombres de programas, nombres de archivos y nombres de variables parcialmente escritos. [ aj ] El sistema de autocompletado de línea de comandos de Bash es muy flexible y personalizable, y a menudo viene con funciones que completan argumentos y nombres de archivos para programas y tareas específicas.Tab ↹
Bash admite la finalización programable a través de los comandos integrados complete, compopt, y compgen. [ 36 ] Esta función está disponible desde la versión beta de 2.04 lanzada en 2000.
Estos comandos permiten la especificación de autocompletado compleja e inteligente para comandos (es decir, programas instalados), funciones, variables y nombres de archivo. [ 37 ]
Los comandos completey compoptespecifican cómo se mostrarán los argumentos de algunos comandos u opciones disponibles en la entrada de readline. A partir de la versión 5.1, la finalización del comando o la opción se activa normalmente mediante la pulsación de tecla después de escribir su nombre. [ 37 ] Esta función solo está disponible en modo interactivo. Tab
Indicaciones
Mensajes configurables . Esta función solo está disponible en modo interactivo.
Documentación
Manual de usuario
El Proyecto GNU proporciona un "manual de usuario" [ 11 ]/usr/share/doc/bash para Bash. A veces se considera un documento más fácil de usar que la página man. "También puede encontrar información sobre Bash... consultando los directorios , /usr/local/share/doc/bash, o similares en su sistema." [ 38 ] En sistemas GNU/Linux, si el programa info está disponible, la versión del Manual GNU relevante para su instalación también debería estar disponible en . [ 11 ] [ 39 ]info bash
Página de manual
El manual técnico más reciente, o "página man" , pretende ser el documento técnico explicativo autorizado para comprender cómo funciona bash. En sistemas GNU/Linux, la versión relevante para su instalación suele estar disponible a través del programa man en . [ 25 ]manbash
ayuda integrada
Con las versiones recientes de Bash, se puede encontrar información sobre los comandos integrados del shell ejecutando help, o en un indicador de terminal donde esté instalado bash.help[nameofbuiltin]man builtins
El comando printf se puede invocar a través de env para asegurar que ejecute el programa encontrado a través de la ruta de búsqueda de su shell, y no un alias de shell o una función integrada: . [ 40 ]envprintf--help
Especificación POSIX
Con el fin de permitir la interoperabilidad entre diferentes programas de shell que se ejecutan en distintos sistemas operativos, la "Especificación POSIX" [ 8 ] influye en cómo se escriben los shells modernos tipo UNIX. Bash "está diseñado para ser una implementación conforme a la parte "Shell y utilidades" de la especificación IEEE POSIX (Estándar IEEE 1003.1)". [ ak ] La publicación más reciente del estándar (2024) está disponible en línea.
El estándar POSIX, o IEEE Std 1003.1, que sirve de base para bash, resulta especialmente informativo.
Recursos adicionales
"El mantenedor del proyecto también tiene una página de Bash que incluye preguntas frecuentes", [ 38 ] [ 41 ] [ 42 ] estas preguntas frecuentes están vigentes a partir de la versión 5.1 de bash y ya no se actualizan.
Se pueden encontrar vías informales de apoyo a través de IRC en libera.chat, en el canal #bash, y también hay listas de correo disponibles. [ 7 ]
Seguridad y vulnerabilidades
scripts raíz
Ejecutar scripts de shell como usuario root ha sido ampliamente criticado durante años por considerarse una mala práctica de seguridad. Una razón común es que, al ejecutar un script como root, los efectos negativos de cualquier error en el script se magnifican debido a los privilegios elevados de root.
Un ejemplo común: un script contiene el comando, pero la variable queda sin definir. En Linux, si el script fuera ejecutado por un usuario normal, el intérprete de comandos intentaría ejecutar el comando como tal, y este fallaría. Sin embargo, si el script fuera ejecutado por el usuario root, probablemente el comando se ejecutaría correctamente y el sistema de archivos se borraría.rm-rf${dir}/$dirrm -rf /
Se recomienda utilizar sudo para cada comando individualmente.
guiones CGI
Los scripts CGI son una fuente importante de vulnerabilidad. [ 43 ] [ 44 ] [ 45 ]
evaluación integrada
"El comando eval es extremadamente potente y extremadamente fácil de usar indebidamente." [ 46 ]
Validación de entrada
" La validación de datos de entrada es el proceso de asegurar que los datos hayan sido sometidos a un proceso de limpieza para confirmar que tienen calidad, es decir, que son correctos y útiles."
La validación de entrada se realiza para garantizar que solo los datos con el formato correcto ingresen al flujo de trabajo de un sistema de información, evitando que los datos con formato incorrecto persistan en la base de datos y provoquen fallos en diversos componentes posteriores. La validación de entrada debe realizarse lo antes posible en el flujo de datos, preferiblemente tan pronto como se reciban los datos de la fuente externa. [ 47 ]
— Hoja de referencia rápida de validación de entrada de OWASP
Neurosis de guerra
En septiembre de 2014, se descubrió una vulnerabilidad de seguridad en el programa. Se la denominó " Shellshock ". Su divulgación pública provocó rápidamente una serie de ataques en Internet . [ 48 ] [ 49 ] [ 50 ]
La explotación de esta vulnerabilidad podría permitir la ejecución de código arbitrario en scripts CGI ejecutables por ciertas versiones de Bash. El error afectaba la forma en que Bash pasaba definiciones de funciones a subshells a través de variables de entorno . [ 51 ] El error había estado presente en el código fuente desde agosto de 1989 (versión 1.03) [ 52 ] y fue corregido en septiembre de 2014 (versión 4.3).
Las correcciones para solucionar los errores se publicaron poco después de su detección. Se recomienda encarecidamente actualizar a la versión más reciente.
Se le asignaron los identificadores de vulnerabilidades comunes CVE- 2014-6271 , CVE- 2014-6277 y CVE- 2014-7169 , entre otros. Según las métricas CVSS 2.x y 3.x, el fallo se considera de gravedad "alta" y "crítica", respectivamente.
Sintaxis obsoleta
- Sustituciones de comandos con estilo de acento grave : está obsoleto [ am ] en favor de:
`...`$(...);
- Uso de
-ao-oen comandostest/[/ ,[[ - El uso de la sintaxis aritmética está desaconsejado [ ap ] y se recomienda utilizar:
$[...]$((...))o((...)), según corresponda;
- El uso de
^como tubería está desaconsejado [ aq ] en favor de|;
Depuración
Tabla de características
- Características del shell especificadas por POSIX :
- Expansión de parámetros de la carcasa [ ar ]
- Parámetros especiales: [ como ]
- Conjunto de utilidades integradas especiales : [ o ]
- Trampa de utilidad integrada especial : [ en ]
- POSIX especifica ciertos usos de la función integrada trap : ...
- Función de utilidad printf : un medio para imprimir de forma fiable el contenido de una variable:
- Funcionalidades de Bash no especificadas por POSIX:
- Utilidades de depuración de terceros:
Ejemplos
Con la expansión de parámetros, una variable no definida o nula puede detener un script."${var:?}"
$ cat ex.sh # ! /bin/env bash bar="foo no está definido" echo "${foo:?$bar}" echo este mensaje no se imprime $ chmod 0700 ./ex.sh $ ./ex.sh ./ex.sh: línea 3: foo: foo no está definido
Imprimir de forma fiable el contenido de un array que contiene espacios y saltos de línea, primero con una sintaxis portable y luego lo mismo en Bash. Cabe destacar que POSIX no tiene arrays con nombre, solo la lista de argumentos, que se puede restablecer con el comando integrado `set` ."$@"
$ bash -o posix $ set -- "a" " b" " > c " $ printf ',%s,\n' " $@ " | sed 's/.*/|&|/' ' |,a,| |, b,| |, | | c ,|
Tenga en cuenta que en Bash, el número de espacios antes del salto de línea se indica claramente.
$ array =( "a" " b" " > c " ) $ declare -p array declare -a array=([0]="a" [1]=" b" [2]=$' \nc ')
Imprimir un mensaje de error cuando haya un problema.
$ cat error.sh # ! /bin/env bash if ! ls -l /dev | grep sdz then echo Error, línea "${LINENO}" fi $ chmod 0700 ./error.sh $ ./error.sh Error, línea 4
Usando xtrace . Si errexit hubiera estado habilitado, no se habría ejecutado.echoquux
$ cat ./test.sh # ! /bin/env bash echo foo false echo quux $ chmod 0700 ./test.sh $ bash -o xtrace -o errexit ./test.sh + echo foo foo + false $ bash -o xtrace ./test.sh + echo foo foo + false + echo quux quux
Nota: $BASHPIDdifiere $$en ciertas circunstancias, como en el caso de subshells que no requieren que bash se reinicie.
$ echo $( echo $BASHPID $$ ) $$ $BASHPID 25680 16920 16920 16920 # | | | | # | | | \- - $BASHPID fuera de la subcapa # | | \- - $$ fuera de la subcapa # | \- - $$ dentro de la subcapa # \- - $BASHPID dentro de la subcapa
Informes de errores
Un comando externo llamado bashbug informa sobre errores del intérprete de comandos Bash. Al ejecutar el comando, se abre el editor predeterminado del usuario con un formulario para completar. El formulario se envía por correo electrónico a los responsables del mantenimiento de Bash (o, de forma opcional, a otras direcciones de correo electrónico). [ 74 ]
Historia
La funcionalidad de los scripts de shell se originó con archivos llamados " runcoms " en referencia al procesador de macros de 1963 del mismo nombre. El sufijo "rc" es la abreviatura de "runcom". [ 75 ] El término "shell" fue acuñado por Louis Pouzin en 1964 o 1965, y apareció en su artículo de 1965, "The SHELL: A Global Tool for Calling and Chaining Procedures in the System", que describe muchas características que posteriormente se encontraron en muchos shells de UNIX. [ 76 ] El estándar ASCII para la codificación de caracteres se definió en 1969 en un documento llamado Request for Comments (RFC) 20. [ 77 ]
Cronología
A continuación se enumeran eventos significativos en la historia de Bash: [ 78 ]
Véase también
- Comparación de intérpretes de comandos
- Multics § Comandos , exec_com: el primer procesador de comandos.
- Descarga FTP del Proyecto GNU de las versiones de Bash 1.14.0 hasta la actual. [ 114 ] [ 115 ]
shells de Unix
- Concha de Almquist (ceniza)
- Shell de Debian-Almquist (dash)
- Concha de Bourne (sh)
- BusyBox
- shell de C (csh)
- Pez (Caparazón interactivo y amigable)
- nsh – intérprete de línea de comandos como fish, pero compatible con POSIX [ 116 ]
- Google Shell (goosh): interfaz gráfica tipo UNIX para la Búsqueda de Google.
- KornShell (ksh) – tiene muchas variantes
- osh (Oil Shell) – Intérprete de línea de comandos UNIX compatible con Bash; disponible en Arch Linux.
- Interfaz PWB (Interfaz Mashey o Programmer's Workbench)
- Qshell – para IBM i
- rc – del Plan 9
- RUNCOM
- rush (Shell de usuario restringido) – disponible en Debian [ 92 ]
- Estructura independiente (de guillotina)
- scsh (El intérprete de Scheme)
- tcsh (shell C de TENEX)
- Caparazón Thompson (tsh)
- Caja de juguetes
- yash (Yet Another Shell) – aspira a ser "el intérprete de comandos más compatible con POSIX del mundo"; disponible en Arch Linux.
- Z shell (zsh)
Interfaz gráfica para scripts
Existen muchos programas que permiten crear una interfaz gráfica para scripts de shell.
- curses - curses es una biblioteca de control de terminal para sistemas tipo Unix, que permite la construcción de aplicaciones con interfaces de usuario de texto (TUI).
- dialog es una utilidad que permite crear cuadros de diálogo en la consola, utilizando las bibliotecas curses y ncurses .
- gtkdialog es la utilidad más funcional para crear aplicaciones gráficas en scripts bash. [ 117 ]
- kdialog: es el equivalente de KDE a zenity. [ 118 ]
- ncurses : una biblioteca de programación para crear interfaces de usuario textuales (TUI) que funcionan en una amplia variedad de terminales.
- whiptail - es un análogo de la utilidad de diálogo, utiliza la biblioteca newt . [ 119 ]
- xdialog es un sustituto de dialog diseñado para proporcionar a los programas ejecutados desde la terminal una interfaz del sistema X Window .
- yad - es una bifurcación de zenity, con más características. [ 120 ]
Lecturas adicionales
- "Acerca de los shells de UNIX". UC Berkeley [ 122 ]
- "Guía avanzada de scripting Bash". Proyecto de documentación de Linux [ 16 ]
- "Especificaciones básicas, edición 8" (es decir, POSIX-2024). IEEE y The Open Group [ 8 ]
- "bash(1)" (es decir, la 'página man'). Free Software Foundation [ 25 ]
- "Wiki de Greg". mywiki.wooledge.org
- "En el principio... estaba la línea de mando". William Morrow & Company [ 124 ]
- "Aprendiendo a usar el Bash Shell". O'Reilly Media, Inc. [ 125 ]
- "Programación de scripts con el shell Bourne-Again". UC Berkeley [ 126 ]
- "Introducción a la programación de scripts de shell". Apple Inc. [ 127 ]
- "Guía de estilo de Shell". Google LLC [ 128 ]
- "La wiki de los hackers de Bash". bash-hackers.org [ 28 ]
Notas
- ↑ "Bash 4.0 está bajo la licencia GLPv3" [ 2 ]
- ↑ "Cap. 2.10.1 Convenciones léxicas de la gramática Shell" [ 8 ]
- ↑ "UNIX distingue entre mayúsculas y minúsculas. Dado que UNIX distingue entre mayúsculas y minúsculas, nuestros scripts de shell también lo hacen." [ 9 ] : 3
- ↑ "Cap. 8 Edición de línea de comandos" [ 11 ]
- ↑ "Cap. 8.5 Modo Readline vi" [ 11 ]
- ↑ "Apéndice D.2 Índice de palabras reservadas de Shell" [ 11 ]
- ↑ "Cuando la expansión se produce dentro de comillas dobles y se realiza la división de palabras, cada parámetro se expande a una palabra separada. Es decir, "$@" es equivalente a "$1" "$2" …." "Cap. 3.4.2 Parámetros especiales" [ 11 ]
- 1 2 "Cap. 6.7 Arreglos" [ 11 ]
- ↑ "Cap. 2 Definiciones" [ 11 ]
- ↑ No confundir con la variable de shell
"$$". - ↑ "Cap. 4.1 Edificios empotrados Bourne Shell" [ 11 ]
- ↑ "Cap. 6.2 Archivos de inicio de Bash" [ 11 ]
- ↑ "Cap. 36.9. Problemas de portabilidad" [ 16 ]
- ↑ "Apéndice B.1 Diferencias de implementación con respecto al shell SVR4.2" [ 11 ]
- 1 2 3 4 5 "Cap. 4.3.1 El conjunto integrado" [ 11 ]
- ↑"In this mode, the
$BASH_ENVand$ENVfiles are not processed, shell functions are not inherited from the environment, and the SHELLOPTS, BASHOPTS, CDPATH and GLOBIGNORE variables, if they appear in the environment, are ignored."[o] - ↑"Ch. 6.12 Shell Compatibility Mode"[11]
- ↑See
set-v.[o] - ↑"Ch. 2.15 Special Builtins"[8]
- ↑"Ch. 7.1 Job Control Basics"[11]
- ↑"Stop, usually Ctrl + z."[9]:25
- ↑"In Korn shell the echo command recognizes these command options by default. In Bash shell we must add the -e switch to the echo command,
echo-e"\n"for one new line."[9]:20 - ↑"Ch. 3.7.3 Command Execution Environment"[11]
- ↑"Ch. 6.6 Aliases"[11]
- ↑"Ch. 3.3 Shell Functions"[11]
- ↑"Ch. 4.1 Bourne Shell Builtins"[11]
- ↑Shell scripts do not require compilation before execution and, when certain requirements are met, can be invoked as commands by using their filename.
- ↑Concept drawn from ALGOL 68.[31]
- ↑"Ch. 3.2.5.2 Conditional Constructs"[11]
- ↑"Ch. 3.2.6 Coprocesses"[11]
- ↑"Ch. 5.3.1 Brace Expansion"[11]
- 12Although they can be used in conjunction, the use of brackets in pattern matching,
[...], and the use of brackets in the testing commands,[and[[ ... ]], are each one different things. - ↑"Ch. 3.1.2.5 Locale-Specific Translation"[11]
- ↑For this functionality, see current versions of
bcandawk, among others. - ↑"Ch. 9 Using History Interactively"[11]
- ↑"Ch. 8.6 Programmable Completion"[11]
- ↑"Ch. 1.1 What is Bash?"[11]
- ↑"Ch. 3.5.4 Command Substitution"[11]
- ↑"The standard form of command substitution occurs when a command is enclosed as follows:
$(command)or (deprecated)`command`."[al] - ↑"Ch. 4.1 Bourne Shell Builtins":
test[11] - ↑"The historical operator-precedence parsing with 4 or more arguments can lead to ambiguities when it encounters strings that look like primaries. The POSIX standard has deprecated the
-aand-oprimaries and enclosing expressions within parentheses. Scripts should no longer use them. It’s much more reliable to restrict test invocations to a single primary, and to replace uses of-aand-owith the shell’s&&and\|\|list operators."[an] - ↑"It dates from Posix circa 1990 (1003.2d9, of which I've lost my paper copy). I implemented it after the Berkeley guys, mostly Marc Teitelbaum, put it into Posix. It ended up getting dropped in favor of the ksh
$((...))expansion, at which point everyone deprecated the old$[...]."[53] - ↑"Note that the reason it's
[!x]instead of[^x]is that^was a pipe operator in the Thompson/Bourne shell. ... (to clarify,^(which looked more like a↑at the time) was a pipe operator in the Thompson shell....[!...]was likely introduced by the Bourne shell (which used\|as pipe operator but kept^as well for backward compatibility)"[54] - ↑"Ch. 3.5.3 Shell Parameter Expansion"[11]
- ↑"Ch. 3.4.2 Special Parameters"[11]
- ↑"Ch. 4.1 Bourne Shell Builtins:trap"[11]
- ↑"Ch. 5.2 Bash Variables"[11]
- ↑"Ch. 4.3.2 The Shopt Builtin"[11]
- ↑"Ch. 4.1 Bourne Shell Builtins:trap"[11]
- ↑"Using an sh-derived shell like bash (the default for new users in Panther)...."[95]
- ↑"Versions of that environment prior to 10.3.X used tcsh, or T shell, as the default."[96]
References
- ↑Chet Ramey (5 July 2025). "Bash-5.3-release available". Retrieved 5 July 2025.
- 12Huber, Mathias (24 February 2009). "Bash 4.0 Introduces Associative Arrays". Linux Magazine. USA: Linux New Media, LLC. OCLC 1305033669. Retrieved 6 July 2026.
- ↑"test.c". github.com. bash 1.11. Archived from the original on 15 October 2021. Retrieved 2 July 2026.
- ↑"COPYING". github.com. Archived from the original on 6 May 2021. Retrieved 2 July 2026.
- 12Ramey, Chet (30 May 2008). "The A–Z of Programming Languages: BASH/Bourne-Again Shell" (Interview). Interviewed by Hamilton, Naomi. Computerworld Australia. Retrieved 4 July 2026.
- 12Ramey, Chet (14 December 2015). "Chet Ramey: Geek of the Week". Simple Talk (Interview). Interviewed by Morris, Richard. Cambridge, UK: Red Gate Software Ltd. Retrieved 4 July 2026.
- 12"GNU Bash". gnu.org. Free Software Foundation, Inc. 22 September 2020. Retrieved 4 July 2026.
- 1234IEEE; The Open Group (14 June 2024). "Base Specifications, Issue 8". "POSIX-2024" (Standard). 1003.1™ (2024 ed.). The IEEE and The Open Group. p. 4107. ISBN 9781957866406. Retrieved 4 July 2026.
- 123Michael, Randal K. (2008). Mastering UNIX(R) Shell Scripting: Bash, Bourne, and Korn Shell Scripting for Programmers, System Administrators, and UNIX Gurus (2 ed.). Indianapolis, Indiana: Wiley Publishing, Inc. ISBN 978-0-470-18301-4. Retrieved 4 July 2026.
- ↑Rippee, Scott (5 October 2012). "Getting started with BASH: A Bash Tutorial". hypexr.org. Retrieved 4 July 2026.
- 123456789101112131415161718192021222324252627282930313233Ramey, Chet; Fox, Brian (18 May 2025). The GNU Bash Reference Manual (5.3 ed.). Free Software Foundation, Inc. Retrieved 4 July 2026.
- 12Garrels, Machtelt (6 June 2008). "Ch. 3.2.1. The path". Introduction to Linux: A Hands on Guide (1.27 ed.). Linux Documentation Project. ISBN 1596821124. Retrieved 4 July 2026.
- ↑Kernighan, Brian W.; Pike, Rob (1984). The UNIX Programming Environment. Englewood Cliffs, New Jersey: Prentice-Hall, Inc. ISBN 0-13-937699-2.
- ↑"Modular data structures in C". dartmouth.edu. Dartmouth College. Archived from the original on 31 August 2024. Retrieved 4 July 2026.
- 12Stevens, Al (1 July 2001). "I Almost Get a Linux Editor and Compiler". Dr. Dobb's Journal: The World of Software Development. Vol. 26, no. 7. Manhasset: CMP Media LLC. pp. 113–116. OCLC 746941758. Retrieved 2 July 2026.
But virtually all the configure and install scripts that come with open-source programs are written for bash, and if you want to understand those scripts, you have to know bash.
- 12Cooper, Mendel (10 March 2014). Advanced Bash Scripting Guide: An in-depth exploration of the art of shell scripting (10 ed.). Linux Documentation Project. Retrieved 4 July 2026.
- ↑Ramey, Chet. "6.11 Bash and POSIX". Case Western Reserve University. Retrieved 8 August 2025.
- 12 – Linux General Commands Manual from ManKier.com
- 12 – Linux General Commands Manual from ManKier.com
- ↑"Ch. 10 – Files". Debian Policy Manual v4.5.0.2. Debian Project. Retrieved 4 July 2026.
- ↑MacKenzie, David; Elliston, Ben; Demaille, Akim (17 March 2026). "Ch. 11 Portable Shell Programming". Autoconf: Creating Automatic Configuration Scripts. Free Software Foundation, Inc. Retrieved 4 July 2026.
For GNU Autoconf version 2.73.
- 12"BASH Debugger". SourceForge. Retrieved 18 August 2025.
- ↑Newham, Cameron (29 March 2005). Learning the bash Shell: Unix Shell Programming. O'Reilly Media, Inc. p. 205. ISBN 978-0-596-55500-9. Retrieved 16 August 2025.
- ↑"dd(1)". www.man7.org. Retrieved 19 October 2025.
- 123"bash(1)". case.edu. Case Western Reserve University. Retrieved 5 July 2026.
- ↑"Sending and Trapping Signals". wooledge.org. Retrieved 5 August 2025.
- ↑"bug-bash archives, Re: Document that set -v inside case statements is special". bug-bash (Mailing list). GNU Project. 20 April 2021. Retrieved 8 August 2025.
- 12Schampera, Jan, ed. (13 February 2022). "The Bash Hackers Wiki". bash-hackers.org. Mitterteich, Germany. Archived from the original on 7 April 2022. Retrieved 5 July 2026.
- ↑"Glossary of Coding Terms for Beginners: iteration". syracuse.edu. Syracuse University. 13 January 2020. Retrieved 15 August 2025.
- ↑"compound - noun (1)". merriam-webster.com. Merriam-Webster's Collegiate Dictionary. Retrieved 15 August 2025.
- ↑Stephen R Bourne (12 June 2015). "Early days of Unix and design of sh"(PDF). bsdcan.org. BSDcan 2015: The Technical BSD Conference. Retrieved 8 August 2025.
- ↑"Advanced Bash Scripting Guide: 37.2: Bash, version 3". Linux Documentation Project. Retrieved 6 July 2026.
- ↑Mallett, Andrew (24 December 2015). Mastering Linux Shell Scripting. Packt Publishing, Ltd. p. 56. ISBN 978-1-78439-759-3. Retrieved 16 August 2025.
Learning this now can save us a lot of pain and heartache later, especially....
- ↑"The Bash Parser". wooledge.org. Retrieved 15 August 2025.
- ↑Ramey, Chet. "The Architecture of Open Source Applications (Volume 1): The Bourne-Again Shell". aosabook.org. Retrieved 15 August 2025.
- ↑"Bash Reference Manual: 8.6 Programmable completion". case.edu. Case Western Reserve University. Retrieved 8 August 2025.
- 12"Advanced Bash Scripting Guide: Appendix J: An Introduction to Programmable Completion". Linux Documentation Project. Retrieved 21 January 2022.
- 12"Bash". Free Software Foundation, Inc.GNU Project. Retrieved 8 August 2025.
- ↑"Bash Reference Manual". case.edu. Case Western Reserve University. Retrieved 8 August 2025.
- ↑"GNU Coreutils manual v.9.7, 15.2 printf: Format and print data". Free Software Foundation, Inc.GNU Project. Retrieved 11 August 2025.
- 12"The GNU Bourne-Again Shell, Top Page". case.edu. Case Western Reserve University. Retrieved 8 August 2025.
- ↑"Frequently Asked Questions". case.edu. Case Western Reserve University. Retrieved 8 August 2025.
- ↑"CVE-2024-2448: Authenticated Command Injection In Progress Kemp LoadMaster". rhinosecuritylabs.com. Rhino Security Labs, Inc. 23 April 2024. Retrieved 6 July 2026.
- ↑"CGI-BIN Specific Vulnerabilities". ucdavis.edu. University of California, Davis. January 1999. Retrieved 6 July 2026.
- ↑"CGI Security". BITS: computing and communications news. Los Alamos National Laboratory. March 1996. Archived from the original on 16 April 2000. Retrieved 6 July 2026.
- ↑"Eval command and security issues". wooledge.org. Retrieved 6 July 2026.
- ↑"Input Validation Cheat Sheet". owasp.org. OWASP. Retrieved 17 August 2025.
- ↑Leyden, John (24 September 2014). "Patch Bash NOW: 'Shell Shock' bug blasts OS X, Linux systems wide open". theregister.co.uk. The Register. Retrieved 6 July 2026.
- ↑Perlroth, Nicole (25 September 2014). "Security Experts Expect 'Shellshock' Software Bug in Bash to Be Significant". The New York Times. Retrieved 6 July 2026.
- ↑Seltzer, Larry (29 September 2014). "Shellshock makes Heartbleed look insignificant". zdnet.com. ZDNet. Retrieved 6 July 2026.
- ↑Sidhpurwala, Huzaifa (24 September 2014). "Bash specially-crafted environment variables code injection attack". redhat.com. Red Hat. Retrieved 6 July 2026.
- ↑Chazelas, Stephane (4 October 2014). "Re: Shellshock timeline (was: CVE-2014-6271: remote code execution through bash)". oss-sec mailing list archives (Mailing list). Nmap Software LLC. Retrieved 6 July 2026.
- ↑Ramey, Chet (7 April 2012). "Re: status on $[arith] for eval arith vsl $((arith))??". bug-bash (Mailing list). GNU Project. Retrieved 6 July 2026.
- ↑Chazelas, Stéphane (24 January 2022). "Shell - negative file globbing". Unix & Linux Stack Exchange. Stack Exchange, Inc. Retrieved 6 July 2026.
- ↑Garrels, Machtelt (27 December 2008). "Ch. 2.3. Debugging Bash scripts". Bash Guide for Beginners (1.11 ed.). Linux Documentation Project. ISBN 0-9744339-4-2. Retrieved 6 July 2026.
- ↑"Bash Reference Manual: 5.2: Bash Variables". Free Software Foundation, Inc.GNU Project. BASHPID. Retrieved 8 August 2025.
- ↑"Bash Reference Manual: 5.2: Bash Variables". Free Software Foundation, Inc.GNU Project. BASH_ARGC. Retrieved 8 August 2025.
- ↑"Bash Reference Manual: 5.2: Bash Variables". Free Software Foundation, Inc.GNU Project. BASH_ARGV. Retrieved 8 August 2025.
- ↑"Bash Reference Manual: 5.2: Bash Variables". Free Software Foundation, Inc.GNU Project. BASH_LINENO. Retrieved 8 August 2025.
- ↑"Bash Reference Manual: 5.2: Bash Variables". Free Software Foundation, Inc.GNU Project. BASH_REMATCH. Retrieved 8 August 2025.
- ↑"Bash Reference Manual: 5.2: Bash Variables". Free Software Foundation, Inc.GNU Project. BASH_SOURCE. Retrieved 8 August 2025.
- ↑"Bash Reference Manual: 5.2: Bash Variables". Free Software Foundation, Inc.GNU Project. BASH_XTRACEFD. Retrieved 8 August 2025.
- ↑"Bash Reference Manual: 5.2: Bash Variables". Free Software Foundation, Inc.GNU Project. EPOCHREALTIME. Retrieved 8 August 2025.
- ↑"Bash Reference Manual: 5.2: Bash Variables". Free Software Foundation, Inc.GNU Project. FUNCNAME. Retrieved 8 August 2025.
- ↑"Bash Reference Manual: 5.2: Bash Variables". Free Software Foundation, Inc.GNU Project. LINENO. Retrieved 8 August 2025.
- ↑"Bash Reference Manual: 5.2: Bash Variables". Free Software Foundation, Inc.GNU Project. PIPESTATUS. Retrieved 8 August 2025.
- ↑"Bash Reference Manual: 5.2: Bash Variables". Free Software Foundation, Inc.GNU Project. PPID. Retrieved 8 August 2025.
- ↑"Bash Reference Manual: 5.2: Bash Variables". Free Software Foundation, Inc.GNU Project. PS4. Retrieved 8 August 2025.
- ↑"ShellCheck: Shell script analysis tool". shellcheck.net.
- ↑Github: shellcheck
- ↑"Debian -- Details of package devscripts in sid". debian.org.
- ↑"Kcov - code coverage". github.io.
- ↑"[Bashdb-devel] Re: [PATCH] fix bashdb script handling of tmp directory". bug-bash (Mailing list). GNU Project. Retrieved 8 August 2025.
- ↑"bashbug(1)". die.net. 21 October 2017. Retrieved 6 July 2026.
- ↑"In Unix, what do some obscurely named commands stand for?". iu.edu. Indiana University. 5 February 2009. Archived from the original on 10 June 2010. Retrieved 6 July 2026.
- ↑Louis Pouzin (25 November 2000). "The Origin of the Shell". multicians.org.
- ↑Cerf, Vint (16 October 1969). "ASCII Format for Network Interchange". ietf.org. UCLA, Network Working Group. Retrieved 29 June 2026.
- ↑"Is there a list of which features were added to specific releases (versions) of Bash?". wooledge.org. Retrieved 6 July 2026.
- ↑Stallman, Richard; Ramey, Chet (10 February 1988). "GNU + BSD = ?". google.com. Newsgroup: comp.unix.questions. Usenet: 2362@mandrill.CWRU.Edu. Retrieved 29 June 2026.
- ↑Stallman, Richard (3 October 2010). "About the GNU Project". Free Software Foundation, Inc.GNU Project. Retrieved 6 July 2026.
- ↑Fox, Brian; Tower Jr., Leonard H. (8 June 1989). "Bash is in beta release!". google.com. Newsgroup: gnu.announce. Retrieved 6 July 2026.
- ↑"Evolution of shells in Linux". ibm.com. IBM. 9 December 2011.
- ↑Torvalds, Linus (26 August 1991). "What would you like to see most in Minix?". google.com. Newsgroup: comp.os.minix. Retrieved 8 August 2025.
- ↑"January 1993 GNU's Bulletin". google.com. Newsgroup: gnu.announce. 20 April 1993. Usenet: gnusenet930421bulletin@prep.ai.mit.edu. Retrieved 6 July 2026.
- ↑Ramey, Chet (1 August 1994). "Bash – the GNU shell (Reflections and Lessons Learned)". linuxjournal.com. Linux Journal. Retrieved 6 July 2026.
- ↑Ramey, Chet (31 October 2010), "Dates in your Computerworld interview", scribd.com, retrieved 6 July 2026
- ↑Ramey, Chet (12 June 1989). "Bash 0.99 fixes & improvements". google.com. Newsgroup: gnu.bash.bug. Retrieved 6 July 2026.
- ↑Ramey, Chet (24 July 1989). "Some bash-1.02 fixes". google.com. Newsgroup: gnu.bash.bug. Retrieved 6 July 2026.
- ↑Fox, Brian (2 March 1990). "Availability of bash 1.05". google.com. Newsgroup: gnu.bash.bug. Retrieved 6 July 2026.
- ↑Bresnahan, Christine; Blum, Richard (April 2015). CompTIA Linux+ Powered by Linux Professional Institute Study Guide: Exam LX0-103 and Exam LX0-104 (3rd ed.). John Wiley & Sons, Inc. p. 5. ISBN 978-1-119-02122-3. Retrieved 6 July 2026.
In Linux, most users run bash because it is the most popular....
- ↑Danesh, Arman; Jang, Michael (February 2006). Mastering Linux. John Wiley & Sons, Inc. p. 363. ISBN 978-0-7821-5277-7. Retrieved 6 July 2026.
- 12"Debian Wiki: Shell". debian.org.
- ↑Ramey, Chet (14 September 2000). "Re: Line-Edit mode is lost if "set -o vi" is in any files sourced on login". bug-bash (Mailing list). GNU Project. Retrieved 8 August 2025.
- ↑Ramey, Chet (9 April 2001). "Bash-2.05 available for FTP". bug-bash (Mailing list). GNU Project. Retrieved 8 August 2025.
- ↑Bartosh, Michael; Faas, Ryan (9 February 2009). Essential Mac OS X Panther Server Administration: Integrating Mac OS X Server Into Heterogeneous Networks (1 ed.). Sebastopol, Calif.: O'Reilly Media. p. 189. ISBN 9780596550608. Retrieved 6 July 2026.
- ↑Foster-Johnson, Eric; Welch, John C.; Anderson, Micah (1 April 2005). Beginning Shell Scripting. Indianapolis, IN: Wiley Publishing, Inc. p. 6. ISBN 978-0-7645-8320-9. Retrieved 6 July 2026.
- ↑"Bash-3.0 available for FTP". bug-bash (Mailing list). GNU Project. Retrieved 8 August 2025.
- ↑"Bash-3.1 released". bug-bash (Mailing list). GNU Project. Retrieved 8 August 2025.
- ↑"Bash-3.2 available for FTP". bug-bash (Mailing list). GNU Project. Retrieved 8 August 2025.
- ↑"Bash-4.0 available for FTP". bug-bash (Mailing list). GNU Project. Retrieved 8 August 2025.
- ↑"Bash-4.1 available for FTP". bug-bash (Mailing list). GNU Project. Retrieved 8 August 2025.
- ↑"Bash-4.2 available for FTP". bug-bash (Mailing list). GNU Project. Retrieved 8 August 2025.
- ↑"User Environment Feature Changes". oracle.com. Oracle Corporation. 2012. Retrieved 6 July 2026.
Oracle Solaris 11 introduces user environment and command-line argument changes that include the following: Shell changes - The default shell, /bin/sh, is now linked to ksh93. The default user shell is the Bourne-again (bash) shell.
- ↑"Bash-4.3 available for FTP". bug-bash (Mailing list). GNU Project. Retrieved 8 August 2025.
- ↑"CVE-2014-6271". cve.org. Retrieved 8 August 2025.
- ↑"CVE-2014-7169". cve.org. Retrieved 8 August 2025.
- ↑"Bash 3.0 Official Patch 1". bug-bash (Mailing list). GNU Project. Retrieved 8 August 2025.
- ↑Briegel, Armin (5 June 2019). "Moving to zsh". scriptingosx.com. Retrieved 8 August 2025.
- ↑"Apple Support – Use zsh as the default shell on your Mac". apple.com. 15 June 2026. Retrieved 6 July 2026.
- ↑Warren, Tom (4 June 2019). "Apple replaces bash with zsh as the default shell in macOS Catalina". theverge.com. The Verge. Retrieved 6 July 2026.
- ↑Hughes, Matthew (4 June 2019). "Why does macOS Catalina use Zsh instead of Bash? Licensing". The Next Web. Retrieved 6 July 2026.
- ↑"Bash-5.0 release available". bug-bash (Mailing list). GNU Project. Retrieved 8 August 2025.
- ↑"Bash-5.1 release available". bug-bash (Mailing list). GNU Project. Retrieved 8 August 2025.
- ↑"Index of /gnu/bash", Free Software Foundation, Inc., GNU Project, 29 August 1996, retrieved 6 July 2026
- ↑"Index of /gnu/bash". swin.edu.au. Swinburne University of Technology. Retrieved 6 July 2026.
- ↑"Command-line shell". archlinux.org. 5 February 2025. Retrieved 8 August 2025.
- ↑Hanny Helal (7 January 2015). "Gtkdialog – Create Graphical (GTK+) Interfaces and Dialog Boxes Using Shell Scripts in Linux". tecmint.com. Tecmint. Retrieved 18 August 2025.
- ↑Kristian Kißling (2009). "Adding graphic elements to your scripts with Zenity and KDialog". linux-magazine.com. Linux Magazine. Issue 99. Retrieved 18 August 2025.
- ↑"Bash Shell Scripting/Whiptail". wikibooks.org. WikiMedia. Retrieved 18 August 2025.
- ↑Dmitri Popov (12 March 2012). "Dress Up Bash Scripts with YAD". linux-magazine.com. Linux Magazine. Retrieved 18 August 2025.
- ↑Pete Metcalfe (2021). "Create GUI dialogs in one line of code". linux-magazine.com. Linux Magazine. Issue 247. Retrieved 18 August 2025.
- ↑"IRIS :: Instructional & Research Information Systems :: FAQ: Unix :: About UNIX Shells". berkeley.edu. University of California, Berkeley. Retrieved 8 August 2025.
- ↑Jones, M. (9 December 2011). "Evolution of shells in Linux: From Bourne to Bash and beyond". IBM Developer. ibm.com (Tutorial). Armonk, New York: International Business Machines Corporation. Retrieved 5 July 2026.
- ↑Stephenson, Neal (9 November 1999). In the Beginning... Was the Command Line (1 ed.). New York: William Morrow & Company. p. 160. ISBN 978-0-380-81593-7.
- ↑Newham, Cameron; Rosenblatt, Bill. "Learning the Bash Shell, 2e". oreilly.com. O'Reilly Media, Inc. Retrieved 8 August 2025.
Content preview
- ↑"Scripting Reference :: Scripting with the Bourne-Again Shell (Bash)". berkeley.edu. University of California, Berkeley. Retrieved 19 May 2024.
- ↑ "Introducción a la programación de scripts de shell" . apple.com . Apple . Consultado el 8 de agosto de 2025.
Copyright © 2003, 2014 Apple Inc. Todos los derechos reservados. ... Actualizado: 10 de marzo de 2014
- ↑ "Guía de estilo de Shell" . github.io ( ed. 2.0). Mountain View, California: Google LLC. 16 de enero de 2025. Consultado el 5 de julio de 2026 .
- ↑ Pouzin, Louis (2 de abril de 1965). "The SHELL: A Global Tool for Calling and Chaining Procedures in the System" (Documento). Instituto Tecnológico de Massachusetts . pág. 37.
- shells de Unix
- Software de 1989
- Software libre multiplataforma
- Lenguajes de programación específicos de dominio
- Lenguajes de programación con ámbito dinámico
- Software libre programado en C
- Software del Proyecto GNU
- Lenguajes de scripting
- Software que utiliza la Licencia Pública General de GNU.
- Lenguajes de programación orientados a texto