Bourne-Again Shell de GNU | |
---|---|
Sesión típica en bash | |
Tipo de | Cáscara de UNIX |
Autor | Brian zorro |
Desarrollador | Chet Ramey |
Escrito en | xi |
Sistema operativo | similar a UNIX |
Idiomas de la interfaz | Inglés , multilingüe ( gettext ) |
Primera edición | 8 de junio de 1989 |
plataforma de hardware | x86_64 [2] y i686 [2] |
ultima versión |
|
versión beta | 5.2-beta ( 13 de abril de 2022 ) |
Formatos de archivo legibles | Guión bash [d] |
Licencia | Licencia Pública General GNU |
Sitio web | gnu.org/software/bash/ |
Archivos multimedia en Wikimedia Commons |
Bash (del inglés Bourne a gain shell , juego de palabras shell "Born again" - shell "reborn") es una variación mejorada y modernizada del shell de comandos Bourne shell . Uno de los shells UNIX modernos más populares . Especialmente popular en el entorno Linux , donde a menudo se usa como un shell de comandos preinstalado.
Es un procesador de comandos que suele funcionar de forma interactiva en una ventana de texto. Bash también puede leer comandos de un archivo llamado script (o script ). Al igual que todos los shells de Unix, admite la finalización de archivos y directorios, sustitución de salida de comandos, variables, control sobre el orden de ejecución, sentencias de bifurcación y bucle. Las palabras clave, la sintaxis y otras características básicas del lenguaje se tomaron prestadas de sh . Otras funciones, como el historial, se han copiado de csh y ksh . Bash básicamente se ajusta al estándar POSIX , pero con varias extensiones [3] .
El nombre "bash" es un acrónimo del inglés. Bourne-again-shell ("otro-Bourne-shell") y es un juego de palabras: Bourne-shell es una de las variedades populares del shell para UNIX (sh), creado por Stephen Bourne ( 1978 ), mejorado en 1987 por Brian Fox . El apellido Bourne (Born) hace eco de la palabra inglesa born , que significa "nacido", por lo tanto: shell de comando nacido de nuevo.
En septiembre de 2014, se descubrió en bash una vulnerabilidad Bashdoor ampliamente explotada .
La gran mayoría de los scripts importantes de shell de Bourne se pueden ejecutar sin modificaciones en bash, con la excepción de aquellos que se refieren a variables especiales de Bourne o usan funciones integradas de Bourne. La sintaxis del comando Bash incluye ideas prestadas del shell Korn ( ksh ) y el shell C ( csh ), como la edición de la línea de comandos, el historial de comandos, la pila de directorios, las variables $RANDOMy la $PPIDsintaxis de sustitución de comandos $(…). Cuando se usa como shell interactivo, Bash admite el autocompletado de nombres de programas, archivos, variables, etc. usando la tecla Tab ↹.
El intérprete de bash tiene muchos comandos integrados, algunos de los cuales tienen archivos ejecutables similares en el sistema operativo . Tenga en cuenta, sin embargo, que la mayoría de las veces no hay páginas del manual para los comandos integrados , y cuando intenta ver la ayuda de un comando integrado, en realidad verá ayuda para el ejecutable. El archivo ejecutable y el comando incorporado pueden diferir en los parámetros. La información sobre los comandos incorporados se enumera en la página del manual de bash:
man bash
De entrada y salida | |
---|---|
echo | genera una expresión o el contenido de una variable ( stdout ), pero tiene limitaciones de uso [4] |
printf | comando de salida formateada, versión extendida del comandoecho |
read | "lee" el valor de una variable desde la entrada estándar ( stdin ), de forma interactiva es el teclado |
sistema de archivos | |
cd | cambia el directorio actual |
pwd | muestra el nombre del directorio de trabajo actual |
pushd | invierte el directorio actual |
popd | devuelve el directorio actual despuéspushd |
dirs | enumera o borra el contenido de la pila de directorios guardados a través depushd |
Acciones sobre variables | |
let | realiza operaciones aritméticas con variables |
eval | traduce una lista de argumentos de una lista en comandos |
set | cambia los valores de las variables internas del script |
unset | elimina una variable |
export | exporta una variable, poniéndola a disposición de los procesos secundarios |
declare,typeset | establecer y/o imponer restricciones a las variables |
getopts | se utiliza para analizar los argumentos pasados al script desde la línea de comando |
Gestión de escenarios | |
source, .(punto) | ejecutar el script especificado |
exit | terminación incondicional del guión |
exec | reemplaza el proceso actual con uno nuevo iniciado por el comandoexec |
shopt | le permite cambiar las claves (opciones) del shell "sobre la marcha" |
equipos | |
true | devuelve el código de salida cero (éxito) |
false | devuelve un código de salida que indica un error |
type prog | imprime la ruta completa a prog |
hash prog | recuerda el camino a prog |
help COMMAND | imprime una breve ayuda sobre el uso del comando interno COMMAND |
Gestión de tareas que se ejecutan en el shell | |
jobs | muestra una lista de tareas que se ejecutan en el shell de comandos o información sobre una tarea específica por su número |
fg | cambia el flujo de entrada a la tarea actual (o a una tarea específica, si se especifica su número) y continúa su ejecución |
bg | continúa la ejecución de la tarea actualmente suspendida (o tareas específicas, si se especifican sus números) en segundo plano |
wait | espera a que se completen las tareas especificadas |
En el caso más simple, un script es una simple lista de comandos escritos en un archivo. El procesador de comandos debe saber que debe procesar este archivo y no solo leer su contenido. Esto se hace mediante una construcción especial llamada shebang : #!. El símbolo #especifica un comentario, pero en este caso shebang significa que después de este símbolo especial hay una ruta al intérprete para ejecutar el script.
La sintaxis del comando bash es una sintaxis de comando de shell Bourne extendida. La especificación definitiva de la sintaxis del comando bash se encuentra en el Manual de referencia de Bash distribuido por el Proyecto GNU . [5]
"Hola mundo" #!/usr/bin/env bash echo '¡Hola mundo!'Este script contiene solo dos líneas. La primera línea le dice al sistema qué programa se está utilizando para ejecutar el archivo. La segunda línea es la única acción que realiza este script, en realidad imprime "¡Hola mundo!" en la terminal
Para hacer que un script sea ejecutable, se pueden usar los siguientes comandos:
chmod +rx scriptname # otorgar permisos de lectura/ejecución a cualquier usuario chmod u+rx scriptname # otorgar permisos de lectura/ejecución solo al "propietario" del scriptPor motivos de seguridad, la ruta al directorio actual .no se incluye en la variable de entorno $PATH. Por lo tanto, para ejecutar el script, debe especificar explícitamente la ruta al directorio actual donde se encuentra el script:
./nombre del guiónAdemás, puede pasar explícitamente un archivo de este tipo al intérpretebash de Bash para su ejecución mediante el comando :
bash scriptnameEn este caso, no se requiere ni la configuración de derechos de acceso ni el uso de una secuencia #!en el código.
bash tiene descriptores de archivo incorporados : 0 (stdin), 1 (stdout), 2 (stderr).
Hay símbolos especiales para operaciones con estos identificadores definidos por el usuario: >(redireccionamiento de salida), <(redireccionamiento de entrada). Los caracteres &, -pueden preceder al número del descriptor; por ejemplo, 2>&1 redirigir el descriptor 2 (stderr) al descriptor 1 (stdout).
0<filenameo<filename | Redirigir la entrada desde un archivofilename |
1>filenameo>filename | Redirigir la salida al archivo "nombre de archivo". Si la opción está deshabilitada noclobber, el archivo se sobrescribe con los datos entrantes |
1>|filenameo>|filename | Redirigir la salida al archivo "nombre de archivo", el archivo se sobrescribe con los datos entrantes |
1>>filenameo >>filename | Redirigir la salida al archivo "nombre de archivo", agregar datos al final del archivo. Si el archivo no existe, se crea |
2>filename | Redirigir la salida de error estándar a "nombre de archivo" |
2>>filename | Redirigir la salida de error estándar al archivo "nombre de archivo", agregar datos al final del archivo. Si el archivo no existe, se crea |
&>filename | Redirigir la salida y los errores a "nombre de archivo" |
2>&1 | Redirigir la salida de error a la salida estándar |
Bash tiene una sintaxis de redirección personalizada que no es compatible con el shell de Bourne. Un ejemplo de redirección de salida estándar y errores estándar al mismo tiempo:
comando & > archivoEsto es más fácil de escribir que el comando equivalente en la sintaxis de shell Bourne.
comando > archivo 2 > & 1Sintaxis heredoc admitida :
Desde la versión 2.05b, bash puede redirigir la entrada estándar desde una cadena usando la siguiente sintaxis " here strings ":
comando <<< "cadena que se leerá como entrada estándar"Si la cadena contiene espacios, debe estar entre comillas o apóstrofes, o los espacios deben estar separados por una barra invertida.
Tenga cuidado: la cadena ingresada usando cadenas aquí contiene una secuencia de terminación de línea implícita: 1 byte adicional de avance de línea o 2 bytes adicionales: retorno de carro y avance de línea.
gato - <<< '123' | wc -c # Resultado: 4 gato < ( echo -n '123' ) | wc -c # Resultado: 3 wc -c <<< '123' # Resultado: 4 echo -n 123 | wc -c # Resultado: 3A partir de la versión 4.1 [6] , se hizo posible especificar una secuencia de terminación de caracteres en una línea e, inmediatamente después, un corchete. Esto puede ser útil para asignar una variable de contenido here-doc:
var = $( cat - <<'TERMSEQ' febrero. ¡Consigue un poco de tinta y llora! Escribe sollozando sobre febrero mientras el aguanieve retumbante se quema en negro en primavera. TERMSEQ )Esto generará un mensaje de advertencia en BASH.
Ejemplo (redirigir la salida estándar a un archivo, escribir datos, cerrar el archivo, vaciar la salida estándar):
# hacer Filedescriptor(FD) 6 una copia de stdout (FD 1) exec 6 > & 1 # abrir el archivo "test.data" para escribir exec 1 >test.data # producir algo de contenido echo "data:data:data" # cerrar archivo "test.data" exec 1 > & - # hacer de stdout una copia de FD 6 (restablecer stdout) exec 1 > & 6 # cerrar FD6 exec 6 > & -Abrir y cerrar archivos:
# abrir archivo test.data para leer exec 6 <test.data # leer hasta el final del archivo mientras se lee -u 6 dta do echo " $dta " done # cerrar archivo test.data exec 6 < & -Captura de la salida de comandos externos:
# ejecutar 'fecha' y poner el resultado en VAR VAR = " $( fecha ) " echo " $VAR " #imprime la fecha en el momento en que se llamó a la línea anteriorLas cadenas de caracteres nulos no son compatibles, las líneas nuevas finales se pierden, a diferencia de las canalizaciones y otras E/S de archivos .
Tenga en cuenta que las comillas del lado izquierdo son opcionales. [7]
Bash solo implementa matrices unidimensionales. Los índices pueden ser valores enteros ( matriz "regular" ) o cadenas ( " matriz asociativa " o "hash").
A pesar de la unificación de la sintaxis para trabajar con arrays ordinarios y asociativos, los primeros no son una variación de los segundos, ni desde el punto de vista del usuario final, ni desde el punto de vista de la lógica interna del propio intérprete.
Como consecuencia natural del soporte de bash para claves "asociativas", existe una capacidad muy limitada para emular arreglos multidimensionales.
Operaciones GeneralesObtenga una cadena que consta de todos los [8] elementos de una matriz separados por un espacio.
valores = " ${ arr [@] } "Obtenga una cadena con todos los [8] índices o claves de una matriz, sin importar si son numéricos o de texto:
teclas = " ${ !arr[@] } "Reemplace de forma masiva la primera aparición de la subcadena "MAY" con "MARCH" en todos los [8] elementos de la matriz y devuelva una cadena compuesta por los elementos resultantes de la matriz, separados por un espacio:
valores = " ${ arr [@]/MAY/MARZO } "Lo mismo, pero en cada elemento [8] de la matriz, se reemplazarán todas las apariciones de la subcadena "MAY":
valores = " ${ arr [@]//MAYO/MARZO } "Hasta ahora, no todas las posibilidades declaradas en la documentación funcionan correctamente para arreglos. Por ejemplo:
[ -v 'nombre_matriz' ]no funciona correctamente para una matriz vacía. [9]
Operaciones en arreglos indexadosBash tiene soporte para matrices unidimensionales. Los elementos de la matriz se pueden inicializar en la forma: my_array[xx]. También puede declarar explícitamente una matriz en un script usando la directiva declare:
declarar -a mi_matrizSe puede acceder a los elementos individuales de una matriz usando llaves: "${my_array[xx]}".
Hay dos formas de inicializar una matriz indexada:
una)
Matriz =( elemento1 elemento2 elemento3 )2)
matriz_temp [ 0 ]= elemento1 temp_array [ 5 ]= elemento matriz_temp [ 9 ]= elementoNAgregar elementos al final de una matriz indexada:
declare -a arrAnimals arrAnimals =( perro elefante caballo vaca zorro koala tortuga ) # Mostrar el contenido de la matriz: echo " ${ arrAnimals [@] } " # Agregar un nuevo elemento al final de la matriz arrAnimals: "cerdo" arrAnimals +=( pig ) # Y muestra el contenido de la matriz nuevamente: echo " ${ arrAnimals [@] } "Obtenga el primer elemento de una matriz:
echo " ${ arrAnimales [0] } "Tanto las matrices indexadas como las asociativas admiten el llamado "rebanado":
# Otra forma de obtener el primer elemento de un arreglo echo " ${ arrAnimals [@]: 0 : 1 } " # Imprime 3 elementos de la matriz comenzando desde el 2: echo " ${ arrAnimals [@]: 2 : 3 } "Nota: en el caso de arreglos asociativos, el orden de los valores en el caso general será aleatorio (determinado por la función hash utilizada), por lo que la operación de corte en un arreglo asociativo, aunque aceptable, tiene un alcance extremadamente limitado de aplicación práctica.
En matrices con índices numéricos, se permite el direccionamiento "inverso" ("negativo"), lo que le permite acceder a los elementos a partir del final de la matriz:
# Valor del último elemento del arreglo echo " ${ arrAnimals [-1] } " # Valor del penúltimo elemento del arreglo echo " ${ arrAnimals [-2] } " # ... y así sucesivamente.Con el comando incorporado mapfile(sinónimo: readarray), puede mostrar el contenido de un archivo de texto en una matriz indexada:
declarar -un archivo con inicios de sesión mapfile fileWithLogins </etc/passwd for (( i = 0 ; i< ${# fileWithLogins [@] } ; i++ )) do echo "Line # $i : ${ fileWithLogins [ $i ] } " done Operaciones de matrices asociativasA partir de la versión 4.0, bash introdujo soporte para arreglos asociativos (los llamados arreglos hash).
Los arreglos asociativos se declaran usando la tecla -Ade comando integrada declare:
declarar -A hshArrayAl igual que con los arreglos indexados, se pueden usar dos sintaxis diferentes para llenar los arreglos asociativos:
una)
TheCapitalOf [ Georgia ]= 'Tbilisi' TheCapitalOf [ Australia ]= 'Canberra' TheCapitalOf [ Pakistán ]= 'Islamabad'2)
TheCapitalOf =([ Georgia ]= 'Tbilisi' [ Australia ]= 'Canberra' [ Pakistan ]= 'Islamabad' )Las matrices asociativas pueden imitar la compatibilidad con matrices multidimensionales:
declare -A a # declara un arreglo asociativo 'a' i = 1 ; j = 2 # inicializa varios índices a [ $i , $j ]= 5 # asigna el valor "5" a la celda "$i,$j" (es decir, "1,2") echo ${ a [ $i , $j ] } # imprimir valores almacenados de "$i,$j"Desafortunadamente, en las versiones actuales de bash, no es posible copiar el contenido de una matriz asociativa a otra mediante una simple asignación. Este problema solo se puede eludir, para lo cual existen dos enfoques fundamentalmente diferentes:
1) Emular la declaración del segundo hash desde cero copiando la declaración del primer hash:
declarar -A hsh1 hsh1 =( ... ) fuente < ( declarar -p hsh1 | sed 's/^declarar -A hsh1/declarar -A hsh2/' )2) Recorra todos los [8] elementos del hash de origen y cópielos en el hash de destino:
declarar -A hsh1 hsh2 hsh1 =( ... ) for k in " ${ !hsh1[@] } " do hsh2 [ " $k " ]= " ${ hsh1 [ " $k " ] } " hecho Trabajo seguro con arreglosLas matrices son una forma conveniente de pasar argumentos generados dinámicamente a funciones o comandos. En este caso, cada elemento de la matriz es un argumento independiente.
argumentos =( ls -l -a / ) ls " ${ argumentos [@] } " # ls -l -a / ls ${ argumentos [@] } # ls -l -a / ls ${ argumentos [*] } # ls -l -a /Sin embargo, al usar arreglos de esta manera, se debe tener cuidado debido a las peculiaridades de expandir arreglos cuando se usan caracteres especiales @y como índices *.
Si la matriz está entre comillas y se expande usando el índice @, entonces se forma una cadena de palabras, donde cada palabra es un elemento separado de la matriz. Sin embargo, si no encierra la expansión de la matriz entre comillas dobles, puede obtener un resultado completamente diferente: los espacios que forman parte de los elementos de la matriz se convierten en separadores de palabras.
args =( -l -a '/home/user/Desktop' ) ls " ${ args [@] } " # ver el contenido del directorio '/home/user/Desktop' ls ${ args [@] } # error : los directorios '/home/user/Desktop' y './desk' no existenUna matriz con índice *, entre comillas dobles, se expande en una sola línea, concatenando todos los elementos de la matriz a través de los delimitadores almacenados en la variable IFS. Si no especifica comillas dobles, la matriz se expande de la misma manera que cuando usa un índice @.
args =( '' usr local bin ) IFS = '/' ls " ${ args [*] } " # ver el contenido del directorio '/usr/local/bin' IFS = '/' ls ${ args [*] } # enumerar el contenido de los directorios '.', './usr', './local' y './bin' uno por unoAl crear una matriz a partir del contenido de una variable de texto, debe tener en cuenta la posible presencia de espacios en el texto. Por ejemplo, como una de las formas de crear una matriz a partir de una cadena con una enumeración, puede considerar reemplazar el carácter delimitador con un espacio. Sin embargo, la presencia de espacios en elementos compartidos conducirá a la fragmentación de los propios elementos en partes.
matriz =( ${ texto //,/ } ) # incorrecto: el texto en la variable 'texto' podría contener caracteres de espacio en blanco IFS = ',' matriz =( $texto ) # correcto: el delimitador es una coma. IFS = ',' read -r -a array <<< " $texto " # correcto (alternativamente, redirigir el contenido de la variable 'texto' al comando 'leer')La creación de una matriz a partir del texto recibido como salida de comandos o de un archivo puede generar errores, ya que no solo las líneas nuevas, sino también los espacios con tabulaciones se considerarán delimitadores por defecto [10] .
matriz =( " $( ls ) " ) # incorrecto: los espacios en los nombres de archivo pueden dividir un nombre de archivo en dos elementos de matriz IFS = $'\n' array =( " $( ls ) " ) # correcto: solo las traducciones de línea serán el delimitador mapfile -t array < < ( ls ) # correcto: alternativa a través del comando mapfile integradoLa canalización pasa la salida del comando anterior a la entrada del siguiente, o a la entrada del shell. El método se usa a menudo para vincular una secuencia de comandos en una sola cadena. El transportador se indica con el símbolo de la tubería |.
Ejemplo ( grep funciona como un filtro en stdout):
nombre de archivo gato | patrón grepEl OR lógico se denota como ||. En operaciones condicionales, el operador ||devuelve 0 (éxito) si uno de los operandos es verdadero.
El AND lógico se denota como &&. En declaraciones condicionales, el operador &&devuelve 0 (éxito) si y solo si ambos operandos son verdaderos.
Nota: La posible confusión en la comprensión surge del hecho de que el comando true (y la finalización exitosa de cualquier comando) termina con un código de retorno de 0, éxito ( false, por el contrario, no 0), mientras que el valor booleano verdadero/falso es no -cero/ es igual a cero.
Ejemplos:
si es falso ; luego echo "con éxito" ; else echo "sin éxito" ; fi sin éxito sea "a=(( 1 && 0 && 123))" ; eco $? ; echo $a 1 # Código de terminación de comando (resultado cero de evaluar una expresión aritmética) 0 # El valor de la variable "a", el resultado de una operación lógica if (( 1 && 0 && 123 )) ; luego echo "verdadero" ; más echo "falso" ; fi falso sea "a=(( 1 && 123 && -345 ))" ; eco $? ; echo $a 0 # Código de salida del comando 1 # Valor de la variable "a", resultado de la operación lógica if (( 1 && 123 && -345 )) ; luego echo "verdadero" ; más echo "falso" ; es verdad falso && echo "Éxito" || eco "fallo" Finalización fallidaBash puede realizar cálculos de enteros dentro de un proceso usando la sintaxis de comando ((…))y variable $((…))[11] , como se muestra a continuación:
VAR = 55 # Establezca VAR en 55 (( VAR = VAR + 1 )) # Agregue uno a VAR. Tenga en cuenta la ausencia del signo '$' (( VAR += 1 )) # Abreviatura de incremento (( ++VAR )) # Otra forma de aumentar VAR en uno. Realiza un incremento de prefijo (( VAR++ )) # Otra forma de incrementar el VAR en uno. Realiza un incremento de sufijo echo $(( VAR * 22 )) # Multiplica VAR por 22 y pasa el resultado al comando echo $ [ VAR * 22 ] # Manera heredada de hacer lo mismo (( VAR <<3)) # Desplazamiento a la izquierda bit a bit (igual que VAR*8) ((VAR>>3 )) # Desplazamiento de bit a la derecha (igual que VAR/8)El comando ((…))también se puede usar en declaraciones condicionales, ya que su parámetro inicial es 0 o 1, lo que se puede interpretar como verdadero o falso:
if (( VAR == Y * 3 + X * 2 )) entonces echo Sí fi (( Z > 23 )) && echo SíEl comando ((…))admite los siguientes operadores de comparación: == != > < >= <=.
Bash no admite cálculos en proceso con números de coma flotante. Solo el shell Unix Korn (versión 1993 ) y zsh (desde la versión 4.0) admiten esta función.
Lista de operaciones matemáticas: +, -, *, /, **(exponenciación), %(módulo de división, resto de división), let - permite utilizar abreviaturas de comandos aritméticos (reduciendo el número de variables utilizadas; por ejemplo: a += bequivalente a = a + b, etc.).
Argumentos:
$$ | pid del shell actual (el proceso de script en sí) |
$! | pid del último proceso en segundo plano |
$? | código de retorno del último proceso (función o script) |
$x | donde x es el número del parámetro pasado al script ( $1, $2etc. $0 es la última ejecución del script) |
$# | número de argumentos de línea de comando |
$* | todos los [8] argumentos como una sola cadena (palabra) |
$@ | lo mismo que $*, pero cada parámetro [8] se presenta como una línea separada (palabra) |
$- | lista de banderas pasadas al script |
$_ | contiene el último argumento del comando anterior |
Variables integradas:
$BASH | ruta al ejecutable bash |
$BASHPID | PID de bash actual * (ver nota) |
$BASH_VERSINFO[n] | matriz de 6 elementos que contienen información de la versión de bash |
$BASH_VERSION | versión de Bash instalada en el sistema |
$DIRSTACK | el contenido de la parte superior de la pila de directorios |
$EDITOR | editor predeterminado |
$EUID | número de identificación de usuario "efectivo" (ID de usuario efectivo) |
$FUNCNAME | nombre de la función actual |
$GLOBIGNORE | una lista de caracteres comodín que se ignorarán al realizar la sustitución del nombre de archivo (globbing) |
$GROUPS | grupos a los que pertenece el usuario actual |
$HOME | directorio de inicio del usuario |
$HOSTNAME | nombre de host de la red |
$HOSTTYPE | tipo de máquina (identifica la arquitectura de hardware) |
$IFS | separador de campo en la cadena de entrada |
$LC_COLLATE | establece el orden de clasificación de los caracteres, en las operaciones de sustitución de nombres de archivos y en las búsquedas con comodines |
$LC_CTYPE | define la codificación de caracteres |
$LINENO | Número de línea del script ejecutable |
$MACHTYPE | arquitectura de hardware |
$OLDPWD | antiguo directorio de trabajo |
$OSTYPE | tipo de sistema operativo |
$PATH | ruta de búsqueda (incluye directorios /usr/bin/, /usr/X11R6/bin/, /usr/local/binetc.) |
$PIPESTATUS | Código de retorno de canal (tubería) |
$PPID | PID (identificador) del proceso padre |
$PS1 | solicitud de línea de comando |
$PS2 | solicitud de línea de comando secundaria, que se muestra cuando se espera una entrada adicional del usuario. Normalmente se muestra como ">" |
$PS3 | mensaje terciario, que se muestra cuando el usuario tiene que hacer una elección en una declaraciónselect |
$PS4 | indicador de nivel 4, impreso (modificado) al comienzo de cada línea de salida de depuración cuando se invoca el script con el -x. Normalmente se muestra como "+", "++", etc. |
$PWD | directorio de trabajo (actual) |
$REPLY | la variable predeterminada donde se escribe la entrada del usuario del comandoread |
$SECONDS | tiempo de ejecución del script (en segundos) |
$SHELLOPTS | lista de opciones de intérprete válidas (solo lectura) |
$SHLVL | nivel de anidamiento de la concha |
Ejemplo:
$ echo $(eco $BASHPID $$) $$ $BASHPID 25680 16920 16920 16920 # | | | | # | | | -- $BASHPID fuera de la subcapa # | | -- $$ fuera de la subcapa # | -- $$ dentro de la subcapa # -- $BASHPID dentro de la subcapa
Bash 3.0 admite expresiones regulares integradas con una sintaxis similar a la de Perl :
[[ cadena = ~ expresión regular ]]La sintaxis de las expresiones regulares está documentada en las páginas de documentación de man 7 regex. El estado de salida se establece en 0 si la expresión regular coincide con la cadena y en 1 en caso contrario. El valor de una subexpresión encerrada entre paréntesis se puede obtener [8] a través de una variable ${BASH_REMATCH[@]}, por ejemplo:
REGEXP = 'foo(bar)bl(.*)' if [[ "abcfoobarbletch" = ~ $REGEXP ]] luego echo "Regex cadena coincidente!" echo " $BASH_REMATCH " # imprime: foobarbletch echo " ${ BASH_REMATCH [1] } " # imprime: bar echo " ${ BASH_REMATCH [2] } " # imprime: etch fiLas expresiones regulares incorporadas suelen ser más rápidas que ejecutar un comando grep externo porque la expresión regular correspondiente se ejecuta dentro del proceso bash. Si la expresión regular o cadena contiene espacios o metacaracteres (como *o ?), deben estar entre comillas. Se recomienda utilizar una variable para contener la expresión regular, como en el ejemplo anterior, para evitar problemas con los caracteres especiales de escape. Puede usar la salida bash con una opción -xpara verificar cómo bash analiza su expresión regular.
La función de expansión de llaves se toma prestada de csh . Permite que se forme una cadena arbitraria utilizando una técnica similar, como se hace con los nombres de archivo. Sin embargo, en bash, las cadenas generadas no tienen que ser nombres de archivos. El resultado de cada expansión de cadena no se ordena, el orden se conserva de izquierda a derecha:
# Esta es una característica de bash echo a { p,c,d,b } e # ape ace ade abeNo debe usar esta característica si el script se va a portar, porque en los scripts tradicionales la expansión de cadenas no funcionará:
# El shell tradicional no da el mismo resultado echo a { p,c,d,b } e # a{p,c,d,b}eCuando la expansión de corchetes se usa en combinación con comodines, los corchetes se expanden primero y luego el resultado se procesa normalmente. Por lo tanto, se puede obtener una lista de imágenes JPEG y PNG en el directorio actual de la siguiente manera:
ls*. { jpg,jpeg,png } # los corchetes se expanden a *.jpg *.jpeg *.png, después de lo cual se realiza una búsqueda con comodinesBash invoca comandos de muchos scripts diferentes al inicio.
Cuando bash se invoca como un shell de inicio de sesión interactivo , lo primero que hace es leer y ejecutar comandos desde un archivo , si ese archivo existe. Después de leer este archivo, examina los siguientes archivos en el siguiente orden: , y , lee e invoca comandos desde el primero que existe y es legible. Al salir, bash lee y ejecuta comandos del archivo . /etc/profile~/.bash_profile~/.bash_login~/.profile~/.bash_logout
Cuando se inicia un shell interactivo, pero no para iniciar sesión, bash lee y ejecuta comandos de archivos /etc/bash.bashrcy ~/.bashrcsi existen. Esto se puede anular con la opción -norc. La opción -rcfile fileobligará a bash a usar los comandos del archivo fileen lugar de /etc/bash.bashrcy ~/.bashrc.
La primera línea del script debe ser una entrada #!/bin/bashsi se conoce la ruta absoluta al ejecutable, o #!/usr/bin/env bashpara determinar automáticamente la ruta al ejecutable a través del comando env usando la variable de entorno PATH [12] .
Los scripts de shell escritos con funciones específicas de bash no funcionarán en sistemas que utilicen el shell Bourne (sh) o uno de sus equivalentes , a menos que se haya instalado bash como un shell adicional. Este problema se volvió especialmente importante cuando Ubuntu comenzó a enviar el shell Debian Almquist (guión) como el shell de secuencias de comandos predeterminado en octubre de 2006, lo que provocó que se rompieran numerosos scripts.
Hay muchos programas que le permiten crear una interfaz gráfica para bash scripts.
Interfaz de usuario en sistemas tipo Unix | |||||||||
---|---|---|---|---|---|---|---|---|---|
Entornos de escritorio |
| ||||||||
Conchas gráficas | |||||||||
Administradores de ventanas |
| ||||||||
Sobre el Protocolo Wayland | |||||||||
Conchas de comando |
| ||||||||
Sistema de ventana X |
|
Proyecto GNU | ||
---|---|---|
Historia | ||
Licencias |
| |
Software _ |
| |
Alusiones personales | ||
Otros temas |
|
POSIX.1-2008 | Utilidades|
---|---|
|