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 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 siempre 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, entre comillas individuales, 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: # vim /home/liveuser/names.txt # salir $ 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 lograr 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" $ sh $ 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 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 . [ o ] Cuando el modo privilegiado está habilitado, las variables del shell incluyen la cadena "privileged".set-pset+pSHELLOPTS
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. [ p ]
— 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 $ 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. [ q ]
Comentarios
Los comentarios pueden ser una forma valiosa de aclarar información o explicar un script o archivo fuente a otra persona que tal vez 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 denotados con el carácter de 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. [ r ]
$ # 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' " $? " código de salida: 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. [ s ] 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. Ctrl-c Ctrl-z
$ 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- en todos los nombres de señales se puede omitir). La secuencia de teclas Ctrl-c en Bash envía una señal SIGINT, señal de interrupción, al proceso en primer plano. La secuencia de teclas Ctrl-z envía la señal SIGSTOP, señal de parada. [ t ] 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.
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 ddcomando. [ 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. [ u ] 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" $ declare -p " $# " bash: declare: 0: no encontrado
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): [ v ]
- 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. [ w ]
— 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. [ x ]
— Manual de referencia de GNU Bash
Comandos integrados
- Varios comandos integrados:
- Funciones integradas especiales POSIX: [ y ]
- cd , pwd , etc.
- conjunto [ z ]
- 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: [ y ]
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 sean modificables por todos los usuarios, o que solo sean modificables por 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 :
- La cadena resultante se ejecuta como un comando.
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 obtiene 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. [ af ]
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 *, ?, [...]. [ ag ]
Localidades
Traducción específica del idioma mediante $"..."sintaxis de comillas. [ ah ]
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
- (A) Los comentarios se ignoran, desde un
#(hash) sin comillas hasta el final de la misma línea; [ 34 ] [ 35 ]
- (B) 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;
- (C) 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
- (D) Se realizan siete tipos de expansiones en el siguiente orden sobre la cadena resultante:
- (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. [ ai ]
- (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, comodín y coincidencia de patrones al estilo shell usando
*,?, , [ ag ][...] - Eliminación de la cotización ;
- (Tipo 1) Expansión de refuerzo
- (E) 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 cuandonoclobberla configuración de un shell está habilitada;
- Escritura de archivos
- (F) 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:
- Comandos internos del intérprete de comandos :
- (G) 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. [ aj ]
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 dentro de una consola de comandos interactiva, Bash utiliza automáticamente cualquier script de autocompletado disponible para sugerir nombres de programas, nombres de archivos y nombres de variables parcialmente escritos. [ ak ] 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/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 . [ 39 ] [ 40 ]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 . [ 39 ] [ 25 ] [ 41 ]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: . [ 42 ]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)" [ 43 ] . 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 ] [ 44 ] [ 45 ] 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. [ 46 ] [ 47 ] [ 48 ]
evaluación integrada
"El comando eval es extremadamente potente y extremadamente fácil de usar indebidamente." [ 49 ]
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 parte externa. [ 50 ]
— 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 . [ 51 ] [ 52 ] [ 53 ]
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 . [ 54 ] El error había estado presente en el código fuente desde agosto de 1989 (versión 1.03) [ 55 ] 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 [ 56 ] en favor de
`...`$(...);
- Uso de
-ao-oen comandostest/[/ ,[[- por ejemplo, está obsoleto en favor de
[-r./file-a!-l./file][-r./file]&&![-l./file];
- por ejemplo, está obsoleto en favor de
- El uso de la sintaxis aritmética está desaconsejado en favor de
$[...]$((...))o((...)), según corresponda;
- El uso de
^como canalización está obsoleto; en su lugar, utilice|; - Cualquier uso de expr o let .
Depuración
Tabla de características
- Características del shell especificadas por POSIX :
- Expansión de parámetros de la capa [ al ]
- Parámetros especiales: [ 71 ] [ 72 ]
- Conjunto de utilidades integradas especiales : [ 73 ] [ 74 ]
- Trampa de utilidad incorporada especial : [ 74 ] [ 75 ]
- 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:
- Variables de Bash: [ am ]
- Conjunto de funciones integradas del shell : [ 73 ] [ 74 ]
- Tienda Shell Builtin : [ un ] [ 74 ]
- Trampa integrada de Shell : [ 75 ] [ 74 ]
- Si bien POSIX especifica ciertos usos de la función integrada trap , las siguientes especificaciones de señales son extensiones de Bash: ...
- Utilidades de depuración de terceros:
- ShellCheck: Herramienta de análisis de scripts de shell; [ 76 ] [ 19 ]
- devscripts-checkbashisms: Comprueba si un script /bin/sh contiene alguna construcción común específica de bash; [ 77 ] [ 18 ]
- kcov: Herramienta de cobertura de código sin opciones de compilación especiales; [ 78 ]
- Bashdb: El depurador simbólico de Bash. [ 22 ] [ 79 ]
Ejemplos
Con la expansión de parámetros, una variable no definida o nula puede detener un script."${var:?}"
$ cat ex.sh # !/bin/bash bar="foo no está definido" echo "${foo:?$bar}" echo este mensaje no se imprime $ ./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` ."$@"
$ # En shell POSIX: $ set -- "a" " b" " > c " $ printf ',%s,\n' " $@ " ,a, , b, , c,
Tenga en cuenta que en Bash, el número de espacios antes del salto de línea se indica claramente.
$ # En Bash: $ 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 ! lsblk | grep sdb then echo Error, línea "${LINENO}" fi $ ./error.sh Error, línea 130
Usando xtrace . Si errexit hubiera estado habilitado, no se habría ejecutado.echoquux
$ cat test.sh # !/bin/env bash set -x foo=bar; echo "${foo}" false echo quux $ ./test.sh + foo=bar + echo bar bar + 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). [ 80 ]
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". [ 81 ] 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. [ 82 ] El estándar ASCII para la codificación de caracteres se definió en 1969 en un documento llamado Request for Comments (RFC) 20. [ 83 ]
Cronología
A continuación se enumeran eventos significativos en la historia de Bash: [ 84 ]
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. [ 120 ] [ 121 ]
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 [ 122 ]
- 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 [ 98 ]
- Estructura independiente (de guillotina)
- scsh (El intérprete de comandos 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. [ 123 ]
- kdialog: es el equivalente de KDE a zenity. [ 124 ]
- 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 . [ 125 ]
- 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. [ 126 ]
Lecturas adicionales
- "Acerca de los shells de UNIX". UC Berkeley [ 128 ]
- "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 [ 129 ]
- "Wiki de Greg". mywiki.wooledge.org
- "En el principio... estaba la línea de mando". William Morrow & Company [ 131 ]
- "Aprendiendo a usar el Bash Shell". O'Reilly Media, Inc. [ 132 ]
- "Programación de scripts con el shell Bourne-Again". UC Berkeley [ 133 ]
- "Introducción a la programación de scripts de shell". Apple Inc. [ 134 ]
- "Guía de estilo de Shell". Google LLC [ 135 ]
- "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 ] : pág. 3
- ↑ "Cap. 8.2.1 Readline Lo esencial" [ 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 ]
- ↑ "Cap. 6.7 Matrices" [ 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 ]
- ↑ "En este modo, los
$BASH_ENVy$ENVno se procesan, las funciones de shell no se heredan del entorno y las variables SHELLOPTS, BASHOPTS, CDPATH y GLOBIGNORE, si aparecen en el entorno, se ignoran." "Cap. 4.3.1 El integrado Set" [ 11 ] - ↑ "Cap. 6.12 Modo de compatibilidad de shell" [ 11 ]
- ↑ Véaseen "Cap. 4.3.1 El conjunto integrado" [ 11 ]
set-v - ↑ "Cap. 2.15 Elementos especiales integrados" [ 8 ]
- ↑ "Cap. 7.1 Conceptos básicos del control de trabajos" [ 11 ]
- ↑ "Detener, normalmente Ctrl + z." [ 9 ] : 25
- ↑ "En Korn shell, el comando echo reconoce estas opciones de comando por defecto. En Bash shell, debemos agregar el modificador -e alcomando echo para una nueva línea." [ 9 ] : 20
echo-e"\n" - ↑ "Cap. 3.7.3 Entorno de ejecución de comandos" [ 11 ]
- ↑ "Cap. 6.6 Alias" [ 11 ]
- ↑ "Cap. 3.3 Funciones de shell" [ 11 ]
- ↑ "Cap. 4.1 Edificios empotrados Bourne Shell" [ 11 ]
- ↑ "Cap. 4.3.1 El conjunto integrado" [ 11 ]
- 1 2 Los scripts de shell no requieren compilación antes de su ejecución y, cuando se cumplen ciertos requisitos, pueden invocarse como comandos utilizando su nombre de archivo.
- ↑ Concepto extraído de ALGOL 68 . [ 31 ]
- ↑ "Cap. 3.2.5.2 Construcciones condicionales" [ 11 ]
- ↑ "Cap. 3.2.6 Coprocesos" [ 11 ]
- ↑ "Cap. 5.3.1 Expansión de la armadura" [ 11 ]
- ↑ "Cap. 6.7 Matrices" [ 11 ]
- 1 2 Aunque se pueden usar conjuntamente, el uso de corchetes en la coincidencia de patrones,y el uso de corchetes en los comandos de prueba,y, son cosas distintas.
[...][[[ ... ]] - ↑ "Cap. 3.1.2.5 Traducción específica de la configuración regional" [ 11 ]
- ↑ Para esta funcionalidad, consulte las versiones actuales de
bcyawk, entre otras. - ↑ "Cap. 9 Uso interactivo de la historia" [ 11 ]
- ↑ "Cap. 8.6 Finalización programable" [ 11 ]
- ↑ "Cap. 3.5.3 Expansión de parámetros de capa" [ 11 ]
- ↑ "Cap. 5.2 Variables de Bash" [ 11 ]
- ↑ "Cap. 4.3.2 El edificio de la tienda" [ 11 ]
- ↑ "Usar un intérprete de comandos derivado de sh como bash (el predeterminado para los nuevos usuarios en Panther)...." [ 101 ]
- ↑ "Las versiones de ese entorno anteriores a la 10.3.X usaban tcsh, o T shell, como predeterminado." [ 102 ]
Referencias
- ↑ Chet Ramey (5 de julio de 2025). "Bash-5.3-release available" . Consultado el 5 de julio de 2025 .
- 1 2 Huber, Mathias (24 de febrero de 2009). "Bash 4.0 introduce matrices asociativas" . Linux Magazine . EE. UU.: Linux New Media, LLC. OCLC 1305033669. Recuperado el 6 de julio de 2026 .
- ↑ "test.c" . github.com . bash 1.11. Archivado del original el 15 de octubre de 2021. Recuperado el 2 de julio de 2026 .
- ↑ "COPIANDO" . github.com . Archivado del original el 6 de mayo de 2021. Recuperado el 2 de julio de 2026 .
- 1 2 Ramey, Chet (30 de mayo de 2008). "El ABC de los lenguajes de programación: BASH/Bourne-Again Shell" (Entrevista). Entrevistado por Hamilton, Naomi. Computerworld Australia . Recuperado el 4 de julio de 2026 .
- 1 2 Ramey, Chet (14 de diciembre de 2015). "Chet Ramey: Geek de la semana" . Simple Talk (Entrevista). Entrevistado por Morris, Richard. Cambridge, Reino Unido: Red Gate Software Ltd. Recuperado el 4 de julio de 2026 .
- 1 2 "GNU Bash" . gnu.org . Free Software Foundation, Inc. 22 de septiembre de 2020. Consultado el 4 de julio de 2026 .
- 1 2 3 4 IEEE ; The Open Group (14 de junio de 2024). "Especificaciones base, número 8" . "POSIX-2024" (Estándar). 1003.1™ ( ed. 2024). IEEE y The Open Group. pág. 4107. ISBN 9781957866406. Consultado el 4 de julio de 2026 .
- 1 2 3 Michael, Randal K. (2008). Mastering UNIX(R) Shell Scripting: Bash, Bourne, and Korn Shell Scripting for Programmers, System Administrators, and UNIX Gurus (2.ª ed.). Indianápolis, Indiana: Wiley Publishing, Inc. ISBN 978-0-470-18301-4. Consultado el 4 de julio de 2026 .
- ↑ Rippee, Scott (5 de octubre de 2012). "Primeros pasos con BASH: Un tutorial de Bash" . hypexr.org . Consultado el 4 de julio de 2026 .
- 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 Ramey, Chet; Fox, Brian (18 de mayo de 2025). El manual de referencia de GNU Bash (ed. 5.3 ). Free Software Foundation, Inc. Recuperado el 4 de julio de 2026 .
- 1 2 Garrels, Machtelt (6 de junio de 2008). "Cap. 3.2.1. El camino" . Introducción a Linux: Una guía práctica ( ed. 1.27). Proyecto de documentación de Linux . ISBN 1596821124. Consultado el 4 de julio de 2026 .
- ↑ Kernighan, Brian W.; Pike , Rob (1984). El entorno de programación UNIX . Englewood Cliffs, Nueva Jersey: Prentice-Hall, Inc. ISBN 0-13-937699-2.
- ↑ "Estructuras de datos modulares en C" . dartmouth.edu . Dartmouth College . Archivado del original el 31 de agosto de 2024. Consultado el 4 de julio de 2026 .
- 1 2 Stevens, Al (1 de julio de 2001). "Casi consigo un editor y compilador de Linux" . Dr. Dobb's Journal: The World of Software Development . Vol. 26, n.º 7. Manhasset: CMP Media LLC. págs. 113–116 . OCLC 746941758. Recuperado el 2 de julio de 2026.
Pero prácticamente todos los scripts de configuración e instalación que vienen con los programas de código abierto están escritos para bash, y si quieres entender esos scripts, tienes que saber bash.
- 1 2 Cooper, Mendel (10 de marzo de 2014). Guía avanzada de scripting de Bash: una exploración profunda del arte del scripting de shell (10.ª ed.). Proyecto de documentación de Linux . Recuperado el 4 de julio de 2026 .
- ↑ Ramey, Chet. "6.11 Bash y POSIX" . Case Western Reserve University . Recuperado el 8 de agosto de 2025 .
- 1 2 – Manual de comandos generales de Linux de ManKier.com
- 1 2 – Manual de comandos generales de Linux de ManKier.com
- ↑ "Cap. 10 – Archivos". Manual de políticas de Debian v4.5.0.2 . Proyecto Debian . Consultado el 4 de julio de 2026 .
- ↑ MacKenzie, David; Elliston, Ben; Demaille, Akim (17 de marzo de 2026). "Cap. 11 Programación de shell portátil" . Autoconf: Creación de scripts de configuración automática . Free Software Foundation, Inc. Recuperado el 4 de julio de 2026.
Para GNU Autoconf versión 2.73
. - 1 2 "BASH Debugger" . SourceForge . Consultado el 18 de agosto de 2025 .
- ↑ {cite book |access-date = 16 August 2025 |date = 29 March 2005 |first = Cameron |last = Newham |page = 205 |publisher = O'Reilly Media, Inc. |title = Learning the bash Shell: Unix Shell Programming |isbn = 978-0-596-55500-9 |url = https://books.google.com/books?id=dzBCH3x6fYEC }}
- ↑ "dd(1)" . www.man7.org . Consultado el 19 de octubre de 2025 .
- 1 2 "Bash(1)" . case.edu . Case Western Reserve University . Consultado el 8 de agosto de 2025 .
- ↑ "Envío y captura de señales" . wooledge.org . Consultado el 5 de agosto de 2025 .
- ↑ "Archivos bug-bash, Re: Documentar que establecer -v dentro de las sentencias case es especial" . bug-bash (Lista de correo). Proyecto GNU . 20 de abril de 2021. Recuperado el 8 de agosto de 2025 .
- 1 2 Schampera, Jan, ed. (13 de febrero de 2022). "The Bash Hackers Wiki" . bash-hackers.org . Mitterteich, Alemania. Archivado del original el 7 de abril de 2022. Recuperado el 5 de julio de 2026 .
- ↑ "Glosario de términos de codificación para principiantes: iteración" . syracuse.edu . Universidad de Syracuse . 13 de enero de 2020. Consultado el 15 de agosto de 2025 .
- ↑ "compuesto - sustantivo (1)" . merriam-webster.com . Diccionario colegiado de Merriam-Webster . Consultado el 15 de agosto de 2025 .
- ↑ Stephen R Bourne (12 de junio de 2015). "Los primeros días de Unix y el diseño de sh" (PDF) . bsdcan.org . BSDcan 2015: La Conferencia Técnica de BSD . Consultado el 8 de agosto de 2025 .
- ↑ "Guía avanzada de scripting de Bash: 37.2: Bash, versión 3" . Proyecto de documentación de Linux . Consultado el 6 de julio de 2026 .
- ↑ Mallett, Andrew (24 de diciembre de 2015). Dominando la programación de scripts de shell de Linux . Packt Publishing, Ltd. pág. 56. ISBN 978-1-78439-759-3. Consultado el 16 de agosto de 2025 .
Aprender esto ahora puede ahorrarnos mucho dolor y sufrimiento más adelante, especialmente...
- ↑ "The Bash Parser" . wooledge.org . Consultado el 15 de agosto de 2025 .
- ↑ Ramey, Chet. "La arquitectura de las aplicaciones de código abierto (volumen 1): el shell Bourne-Again" . aosabook.org . Consultado el 15 de agosto de 2025 .
- ↑ "Manual de referencia de Bash: 8.6 Finalización programable" . case.edu . Case Western Reserve University . Consultado el 8 de agosto de 2025 .
- 1 2 "Guía avanzada de scripting de Bash: Apéndice J: Introducción a la finalización programable" . Proyecto de documentación de Linux . Consultado el 21 de enero de 2022 .
- 1 2 "Bash" . Free Software Foundation, Inc. Proyecto GNU . Consultado el 8 de agosto de 2025 .
- 1 2 Free Software Foundation . "Manual de GNU Bash" . Free Software Foundation, Inc. Proyecto GNU . Consultado el 8 de agosto de 2025 .
- ↑ "Manual de referencia de Bash" . case.edu . Case Western Reserve University . Consultado el 8 de agosto de 2025 .
- ↑ "git: index: bash.git" . Free Software Foundation, Inc. Proyecto GNU . Consultado el 8 de agosto de 2025 .
- ↑ "Manual de GNU Coreutils v.9.7, 15.2 printf: Formatear e imprimir datos" . Free Software Foundation, Inc. Proyecto GNU . Consultado el 11 de agosto de 2025 .
- ↑ "Manual de GNU Bash: 1.1: ¿Qué es Bash?" . Free Software Foundation, Inc. Proyecto GNU . Consultado el 8 de agosto de 2025 .
- 1 2 "The GNU Bourne-Again Shell, Top Page" . case.edu . Case Western Reserve University . Consultado el 8 de agosto de 2025 .
- ↑ "Preguntas frecuentes" . case.edu . Universidad Case Western Reserve . Consultado el 8 de agosto de 2025 .
- ↑ "CVE-2024-2448: Inyección de comandos autenticados en curso en Kemp LoadMaster" . rhinosecuritylabs.com . Rhino Security Labs, Inc. 23 de abril de 2024. Consultado el 6 de julio de 2026 .
- ↑ "Vulnerabilidades específicas de CGI-BIN" . ucdavis.edu . Universidad de California, Davis . Enero de 1999. Consultado el 6 de julio de 2026 .
- ↑ "Seguridad CGI" . BITS: noticias sobre informática y comunicaciones . Laboratorio Nacional de Los Alamos. Marzo de 1996. Archivado del original el 16 de abril de 2000. Consultado el 6 de julio de 2026 .
- ↑ "Comando de evaluación y problemas de seguridad" . wooledge.org . Consultado el 6 de julio de 2026 .
- ↑ "Hoja de referencia rápida para la validación de entradas" . owasp.org . OWASP . Consultado el 17 de agosto de 2025 .
- ↑ Leyden, John (24 de septiembre de 2014). "Patch Bash NOW: El error 'Shell Shock' deja al descubierto los sistemas OS X y Linux" . theregister.co.uk . The Register . Consultado el 6 de julio de 2026 .
- ↑ Perlroth, Nicole (25 de septiembre de 2014). "Los expertos en seguridad esperan que el error de software 'Shellshock' en Bash sea significativo" . The New York Times . Consultado el 6 de julio de 2026 .
- ↑ Seltzer, Larry (29 de septiembre de 2014). "Shellshock hace que Heartbleed parezca insignificante" . zdnet.com . ZDNet . Consultado el 6 de julio de 2026 .
- ↑ Sidhpurwala, Huzaifa (24 de septiembre de 2014). "Ataque de inyección de código mediante variables de entorno especialmente diseñadas en Bash" . redhat.com . Red Hat . Consultado el 6 de julio de 2026 .
- ↑ Chazelas, Stephane (4 de octubre de 2014). "Re: Cronología de Shellshock (antes: CVE-2014-6271: ejecución remota de código a través de bash)" . Archivos de la lista de correo oss-sec (Lista de correo). Nmap Software LLC . Recuperado el 6 de julio de 2026 .
- ↑ "Sustitución de comandos (Manual de referencia de Bash)" . www.gnu.org . Consultado el 14 de enero de 2026 .
- ^ Garrels, Machtelt (27 de diciembre de 2008). "Cap. 2.3. Depuración de scripts Bash" . Guía Bash para principiantes (1.11 ed.). Proyecto de documentación de Linux . ISBN 0-9744339-4-2. Consultado el 6 de julio de 2026 .
- ↑ "Manual de referencia de Bash: 5.2: Variables de Bash" . Free Software Foundation, Inc. Proyecto GNU . BASHPID . Consultado el 8 de agosto de 2025 .
- ↑ "Manual de referencia de Bash: 5.2: Variables de Bash" . Free Software Foundation, Inc. Proyecto GNU . BASH_ARGC . Consultado el 8 de agosto de 2025 .
- ↑ "Manual de referencia de Bash: 5.2: Variables de Bash" . Free Software Foundation, Inc. Proyecto GNU . BASH_ARGV . Consultado el 8 de agosto de 2025 .
- ↑ "Manual de referencia de Bash: 5.2: Variables de Bash" . Free Software Foundation, Inc. Proyecto GNU . BASH_LINENO . Consultado el 8 de agosto de 2025 .
- ↑ "Manual de referencia de Bash: 5.2: Variables de Bash" . Free Software Foundation, Inc. Proyecto GNU . BASH_REMATCH . Consultado el 8 de agosto de 2025 .
- ↑ "Manual de referencia de Bash: 5.2: Variables de Bash" . Free Software Foundation, Inc. Proyecto GNU . BASH_SOURCE . Consultado el 8 de agosto de 2025 .
- ↑ "Manual de referencia de Bash: 5.2: Variables de Bash" . Free Software Foundation, Inc. Proyecto GNU . BASH_XTRACEFD . Consultado el 8 de agosto de 2025 .
- ↑ "Manual de referencia de Bash: 5.2: Variables de Bash" . Free Software Foundation, Inc. Proyecto GNU . EPOCHREALTIME . Consultado el 8 de agosto de 2025 .
- ↑ "Manual de referencia de Bash: 5.2: Variables de Bash" . Free Software Foundation, Inc. Proyecto GNU . FUNCNAME . Consultado el 8 de agosto de 2025 .
- ↑ "Manual de referencia de Bash: 5.2: Variables de Bash" . Free Software Foundation, Inc. Proyecto GNU . LINENO . Consultado el 8 de agosto de 2025 .
- ↑ "Manual de referencia de Bash: 5.2: Variables de Bash" . Free Software Foundation, Inc. Proyecto GNU . PIPESTATUS . Consultado el 8 de agosto de 2025 .
- ↑ "Manual de referencia de Bash: 5.2: Variables de Bash" . Free Software Foundation, Inc. Proyecto GNU . PPID . Consultado el 8 de agosto de 2025 .
- ↑ "Manual de referencia de Bash: 5.2: Variables de Bash" . Free Software Foundation, Inc. Proyecto GNU . PS4 . Consultado el 8 de agosto de 2025 .
- ↑ "Manual de referencia de Bash: 3.4.2: Parámetros especiales" . Free Software Foundation, Inc. Proyecto GNU . Consultado el 8 de agosto de 2025 .
- ↑ "Lenguaje de comandos de shell" . opengroup.org .
- 1 2
- 1 2 3 4 5 "Bash(1), comandos integrados de Shell" . case.edu . Case Western Reserve University . Consultado el 8 de agosto de 2025 .
- 1 2 "Funciones integradas de Bourne Shell (Manual de referencia de Bash)" . Free Software Foundation, Inc. Proyecto GNU . Consultado el 8 de agosto de 2025 .
- ↑
- ↑ "Debian -- Detalles de los scripts de desarrollo de paquetes en sid" . debian.org .
- ↑ "Kcov - cobertura de código" . github.io .
- ↑ " [ Bashdb-devel ] Re: [ PATCH ] fix bashdb script handling of tmp directory" . bug-bash (Lista de correo). Proyecto GNU . Consultado el 8 de agosto de 2025 .
- ↑ "bashbug(1)" . die.net . 21 de octubre de 2017 . Consultado el 6 de julio de 2026 .
- ↑ "¿En Unix, qué significan algunos comandos con nombres poco claros?" . iu.edu . Universidad de Indiana. 5 de febrero de 2009. Archivado del original el 10 de junio de 2010. Consultado el 6 de julio de 2026 .
- ↑ Louis Pouzin (25 de noviembre de 2000). "El origen de la concha" . multicians.org .
- ↑ Cerf, Vint (16 de octubre de 1969). "Formato ASCII para intercambio de red" . ietf.org . UCLA, Grupo de Trabajo de Redes . Consultado el 29 de junio de 2026 .
- ↑ "¿Existe una lista de las características que se agregaron a las versiones específicas de Bash?" . wooledge.org . Consultado el 6 de julio de 2026 .
- ↑ Stallman, Richard; Ramey, Chet (10 de febrero de 1988). "GNU + BSD = ?" . google.com . Grupo de noticias : comp.unix.questions . Usenet: 2362@mandrill.CWRU.Edu . Consultado el 29 de junio de 2026 .
- ↑ Stallman, Richard (3 de octubre de 2010). "Acerca del Proyecto GNU" . Free Software Foundation, Inc. Proyecto GNU . Recuperado el 6 de julio de 2026 .
- ↑ Fox, Brian; Tower Jr., Leonard H. (8 de junio de 1989). "¡Bash está en versión beta!" . google.com . Grupo de noticias : gnu.announce . Consultado el 6 de julio de 2026 .
- ↑ "Evolución de los shells en Linux" . ibm.com . IBM. 9 de diciembre de 2011.
- ↑ Torvalds, Linus (26 de agosto de 1991). "¿Qué te gustaría ver más en Minix?" . google.com . Grupo de noticias : comp.os.minix . Consultado el 8 de agosto de 2025 .
- ↑ "Boletín de GNU de enero de 1993" . google.com . Grupo de noticias : gnu.announce . 20 de abril de 1993. Usenet: gnusenet930421bulletin@prep.ai.mit.edu . Consultado el 6 de julio de 2026 .
- ↑ Ramey, Chet (1 de agosto de 1994). "Bash: el intérprete de comandos de GNU (reflexiones y lecciones aprendidas)" . linuxjournal.com . Linux Journal . Consultado el 6 de julio de 2026 .
- ↑ Ramey, Chet (31 de octubre de 2010), "Fechas en tu entrevista con Computerworld" , scribd.com , consultado el 6 de julio de 2026
- ↑ Ramey, Chet (12 de junio de 1989). "Correcciones y mejoras de Bash 0.99" . google.com . Grupo de noticias : gnu.bash.bug . Consultado el 6 de julio de 2026 .
- ↑ Ramey, Chet (24 de julio de 1989). "Algunas correcciones para bash-1.02" . google.com . Grupo de noticias : gnu.bash.bug . Consultado el 6 de julio de 2026 .
- ↑ Fox, Brian (2 de marzo de 1990). "Disponibilidad de bash 1.05" . google.com . Grupo de noticias : gnu.bash.bug . Consultado el 6 de julio de 2026 .
- ↑ Bresnahan, Christine; Blum, Richard (abril de 2015). Guía de estudio del CompTIA Linux+ Powered by Linux Professional Institute: Examen LX0-103 y Examen LX0-104 (3.ª ed.). John Wiley & Sons, Inc. pág. 5. ISBN 978-1-119-02122-3. Consultado el 6 de julio de 2026.
En Linux, la mayoría de los usuarios usan bash porque es el más popular....
- ↑ Danesh, Arman; Jang, Michael (febrero de 2006). Mastering Linux . John Wiley & Sons, Inc. pág. 363. ISBN 978-0-7821-5277-7. Consultado el 6 de julio de 2026 .
- 1 2 "Debian Wiki: Shell" . debian.org .
- ↑ Ramey, Chet (14 de septiembre de 2000). "Re: El modo de edición de línea se pierde si "set -o vi" está en cualquier archivo cargado al iniciar sesión" . bug-bash (Lista de correo). Proyecto GNU . Recuperado el 8 de agosto de 2025 .
- ↑ Ramey, Chet (9 de abril de 2001). "Bash-2.05 disponible para FTP" . bug-bash (Lista de correo). Proyecto GNU . Recuperado el 8 de agosto de 2025 .
- ↑ Bartosh, Michael ; Faas, Ryan (9 de febrero de 2009). Essential Mac OS X Panther Server Administration: Integrating Mac OS X Server Into Heterogeneous Networks (1.ª ed.). Sebastopol, California: O'Reilly Media. pág. 189. ISBN 9780596550608. Consultado el 6 de julio de 2026 .
- ↑ Foster-Johnson, Eric; Welch, John C.; Anderson, Micah (1 de abril de 2005). Introducción a la programación de scripts de shell . Indianápolis, IN: Wiley Publishing, Inc. pág. 6. ISBN 978-0-7645-8320-9. Consultado el 6 de julio de 2026 .
- ↑ "Bash-3.0 disponible para FTP" . bug-bash (Lista de correo). Proyecto GNU . Consultado el 8 de agosto de 2025 .
- ↑ "Bash-3.1 lanzado" . bug-bash (Lista de correo). Proyecto GNU . Consultado el 8 de agosto de 2025 .
- ↑ "Bash-3.2 disponible para FTP" . bug-bash (Lista de correo). Proyecto GNU . Consultado el 8 de agosto de 2025 .
- ↑ "Bash-4.0 disponible para FTP" . bug-bash (Lista de correo). Proyecto GNU . Consultado el 8 de agosto de 2025 .
- ↑ "Bash-4.1 disponible para FTP" . bug-bash (Lista de correo). Proyecto GNU . Consultado el 8 de agosto de 2025 .
- ↑ "Bash-4.2 disponible para FTP" . bug-bash (Lista de correo). Proyecto GNU . Consultado el 8 de agosto de 2025 .
- ↑ "Cambios en las características del entorno de usuario" . oracle.com . Oracle Corporation . 2012. Consultado el 6 de julio de 2026.
Oracle Solaris 11 introduce cambios en el entorno de usuario y en los argumentos de la línea de comandos que incluyen lo siguiente: Cambios en el shell: el shell predeterminado, /bin/sh, ahora está vinculado a ksh93. El shell de usuario predeterminado es el shell Bourne-again (bash).
- ↑ "Bash-4.3 disponible para FTP" . bug-bash (Lista de correo). Proyecto GNU . Consultado el 8 de agosto de 2025 .
- ↑ "CVE-2014-6271" . cve.org . Consultado el 8 de agosto de 2025 .
- ↑ "CVE-2014-7169" . cve.org . Consultado el 8 de agosto de 2025 .
- ↑ "Bash 3.0 Parche oficial 1" . bug-bash (Lista de correo). Proyecto GNU . Consultado el 8 de agosto de 2025 .
- ↑ Briegel, Armin (5 de junio de 2019). "Transición a zsh" . scriptingosx.com . Consultado el 8 de agosto de 2025 .
- ↑ "Soporte de Apple: usa zsh como intérprete de comandos predeterminado en tu Mac" . apple.com . 15 de junio de 2026. Consultado el 6 de julio de 2026 .
- ↑ Warren, Tom (4 de junio de 2019). "Apple reemplaza bash con zsh como intérprete de comandos predeterminado en macOS Catalina" . theverge.com . The Verge . Consultado el 6 de julio de 2026 .
- ↑ Hughes, Matthew (4 de junio de 2019). "¿Por qué macOS Catalina usa Zsh en lugar de Bash? Licencias" . The Next Web . Recuperado el 6 de julio de 2026 .
- ↑ "Versión Bash-5.0 disponible" . bug-bash (Lista de correo). Proyecto GNU . Consultado el 8 de agosto de 2025 .
- ↑ "Lanzamiento de Bash-5.1 disponible" . bug-bash (Lista de correo). Proyecto GNU . Consultado el 8 de agosto de 2025 .
- ↑ "Índice de /gnu/bash" , Free Software Foundation, Inc. , Proyecto GNU , 29 de agosto de 1996 , consultado el 6 de julio de 2026
- ↑ "Índice de /gnu/bash" . swin.edu.au. Universidad Tecnológica de Swinburne . Consultado el 6 de julio de 2026 .
- ↑ "Consola de línea de comandos" . archlinux.org . 5 de febrero de 2025. Consultado el 8 de agosto de 2025 .
- ↑ Hanny Helal (7 de enero de 2015). "Gtkdialog: crea interfaces gráficas (GTK+) y cuadros de diálogo usando scripts de shell en Linux" . tecmint.com . Tecmint . Consultado el 18 de agosto de 2025 .
- ↑ Kristian Kißling (2009). "Añadiendo elementos gráficos a tus scripts con Zenity y KDialog" . linux-magazine.com . Linux Magazine. Número 99. Consultado el 18 de agosto de 2025 .
- ↑ "Bash Shell Scripting/Whiptail" . wikibooks.org . WikiMedia . Consultado el 18 de agosto de 2025 .
- ↑ Dmitri Popov (12 de marzo de 2012). "Dress Up Bash Scripts with YAD" . linux-magazine.com . Linux Magazine . Consultado el 18 de agosto de 2025 .
- ↑ Pete Metcalfe (2021). "Crear diálogos GUI en una sola línea de código" . linux-magazine.com . Linux Magazine. Número 247. Consultado el 18 de agosto de 2025 .
- ↑ "IRIS :: Sistemas de información para la instrucción e investigación :: Preguntas frecuentes: Unix :: Acerca de los shells de UNIX" . berkeley.edu . Universidad de California, Berkeley . Consultado el 8 de agosto de 2025 .
- ↑ "Bash(1)" . case.edu . Case Western Reserve University . Consultado el 5 de julio de 2026 .
- ↑ Jones, M. (9 de diciembre de 2011). "Evolución de los shells en Linux: De Bourne a Bash y más allá" . IBM Developer. ibm.com (Tutorial). Armonk, Nueva York: International Business Machines Corporation . Recuperado el 5 de julio de 2026 .
- ↑ Stephenson, Neal (9 de noviembre de 1999). En el principio... estaba la línea de comandos (1.ª ed.). Nueva York: William Morrow & Company. pág. 160. ISBN 978-0-380-81593-7.
- ↑ Newham, Cameron; Rosenblatt, Bill. "Aprendiendo a usar la Bash Shell, 2.ª ed." . oreilly.com . O'Reilly Media, Inc. . Consultado el 8 de agosto de 2025.
Vista previa del contenido
- ↑ "Referencia de scripting :: Scripting con el shell Bourne-Again (Bash)" . berkeley.edu . Universidad de California, Berkeley . Consultado el 19 de mayo de 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