Bash
Na Galipedia, a wikipedia en galego.
Bash é un shell de Unix (intérprete de comandos de Unix) escrito para o proxecto GNU. O seu nome é o acrónimo de Bourne-again shell (Consola Bourne Renacida) — un xogo de palabras sobor o Bourne shell (sh), que foi unha das primeiros consolas importantes de Unix. Cara 1978 o shell Bourne era o shell distribuido co Unix Version 7. O shell Bourne orixinal foi escrito por Stephen Bourne, por entón un investigador dos Bell Labs. O shell Bash foi escrito en 1987 por Brian Fox. En 1990, Chet Ramey convertiuse no seu principal mantedor. Bash é o shell por defecto na mayoría de sistemas Linux ademáis de Mac OS X Tiger, e pode executarse na maioría dos sistemas operativos tipo Unix. Tambén foi portado a Microsoft Windows polo proyecto Cygwin.
Índice |
[editar] Sintaxe do Bash
A sintaxe de comandos do Bash é un superconxunto da sintaxe do shell Bourne. A especificación definitiva da sintaxe de comandos do Bash, pódese atopar no Bash Reference Manual distribuido polo proxecto GNU. Esta sección destaca algunhas das características únicas do Bash.
A grande maioría dos shell scripts (guíons de comandos) Bourne poden ser executados por Bash sen nengún cambio, coa excepción daqules shell scripts Bourne que fan referencia a variables especiais de Bourne ou que utilizan un comando interno de Bourne. A sintaxe de comandos de Bash inclue ideas tomadas desde o Korn shell (ksh) e o C shell (csh), como a edición da liña de comandos, o historial de comandos, a pila de directorios, as variables $RANDOM e $PPID, e a sintaxe de substitución de comandos POSIX: $(...). Cando se utiliza coma un intérprete de comandos interactivo, Bash proporcioa autocompletado de nomes de programas, nomes de ficheiros, nomes de variables, etc, cando o usuario preme a tecra TAB.
A sintaxe de Bash ten moitas extensións que non proporcioa o shell Bourne. Varias das mencioadas extensións enuméranse a continuación.
[editar] Matemáticas con enteiros
Unha gran limitación do shell Bourne é que non pode realizar cálculos con enteiros sen lanzar un proceso externo. Un proceso Bash pede realizar cálculos con enteiros utilizando o comando ((...)) e a sintaxe de variables $[...] da seguiente maneira:
VAR=55 # Asigna o valor enteiro 55 á variable VAR. ((VAR = VAR + 1)) # Suma un á variable VAR. Olle a ausencia do carácter '$'. ((++VAR)) # Outra maneira de sumar un a VAR. Preincremento estilo C. ((VAR++)) # Outra maneira de sumar un a VAR. Postincremento estilo C. echo $[VAR * 22] # Multiplica a variable VAR por 22 e substitue o comando polo resultado. echo $((VAR * 22)) # Outra maneira de realizalo mesmo.
O comando ((...)) tambén podese utilizar en sentencias condicionais, xa que seu código de retorno é 0 ou 1 dependendo de se a condición é certa ou falsa:
if ((VAR == Y * 3 + X * 2)) then echo Si fi ((Z > 23)) && echo Si
O comando ((...)) soporta os siguientes operadores relacionais: '==', '!=', '>', '<', '>=', y '<='.
Un proceso Bash non pode realizar cálculos en coma flotante. Os únicos shell Unix capaces desto son o Korn Shell (versión de 1993) e o zsh (a partir da versión 4.0).
[editar] Redireccións de Entrada/Saida
A sintáxe do Bash permite diferentes maneiras de redirección de entrada/saida das que o Shell Bourne tradicional carece. Bash pode redirixir a saida estándar e os fluxos de saida de error á vez utilizando a sintaxe:
comando &> ficheiro
que é máis simple que tecrear o comando Bourne equivalente, "comando > ficheiro 2>&1". Desde a versión 2.05b, Bash pode redirixir a entrada estándar desde unha cadea utilizando a siguiente sintaxe (denominada "here strings"):
comando <<< "cadea a leer coma entrada estándar"
Se a cadea contén espazos en branco, débense utilizar comillas.
Exemplo: Redirixe a saida estándar a un ficheiro, escribe datos, cerra o ficheiro e renicia stdout
# Fai que o descriptor de ficheiro 6 sexaa unha copia de stdout (descriptor ficheiro 1) exec 6>&1 # abre o fichero "test.data" pra escritura exec 1>test.data # xenera algún contido echo "data:data:data" # pecha o ficheiro "test.data" exec 1>&- # Reinicia stdout o facer que sexa unha copia do descriptor de ficheiro 6 exec 1>&6 # pecha o descriptor de ficheiro 6 exec 6>&-
Abre e pecha ficheiros
# abre o ficheiro test.data pra letura exec 6<test.data # lee ata o final do ficheiro while read -u 6 dta do echo "$dta" done # pecha o ficheiro test.data exec 6<&-
Captura a saida de comandos externos
# executa 'find' e garda os resultados en VAR # busca nomes de ficheiros que rematan coa letra "h" VAR=$(find . -name "*h")
[editar] Expresións regulares
Os procesos Bash 3.0 soportan emparellaminto de expresións regulares utilizando a seguinte sintaxe, reminiscente do Perl:
[[ string =~ regex ]]
A sintaxe de expresións regulares é a mesma que documenta a páxina do manual regex(3). O estado de saida do comando anterior é 0 se a cadea concorda coa expresión regular, 1 se non casan. Nas expresións regulares, as partes delimitadas por paréntess, poden ser accedidas utilizando a variable shell BASH_REMATCH, da siguinte maneira:
if [[ abcfoobarbletch =~ 'foo(bar)bl(.*)' ]] then echo The regex matches! echo $BASH_REMATCH -- outputs: foobarbletch echo ${BASH_REMATCH[1]} -- outputs: bar echo ${BASH_REMATCH[2]} -- outputs: etch fi
Esta sintaxe proporciona un rendimento superior a lanzar un proceso separado pra executar un comando grep, porque o emparellamento das expresións regulares ten lugar no propio proceso Bash. Se a expresión regular ou a cadea contén un espazo en branco, ou un metacarácter do shell (coma '*' ou '?'), debe estar entre comillas.
[editar] Escape con contrabarra
As verbas coa forma $'string' tratanse dun modo especial. Estas verbas expandense a string, cos carácteres escapados pola contrabarra reemplazados según especifica o linguaxe de programación C. As secuencias de escape con contrabarra, decodificanse do seguinte modo:
Backslash Escape |
Expands To ... |
---|---|
\a | An alert (bell) character |
\b | A backspace character |
\e | An escape character |
\f | A form feed character |
\n | A new line character |
\r | A carriage return character |
\t | A horizontal tab character |
\v | A vertical tab character |
\\ | A backslash character |
\' | A single quote character |
\nnn | The eight-bit character whose value is the octal value nnn (one to three digits) |
\xHH | The eight-bit character whose value is the hexadecimal value HH (one or two hex digits) |
\cx | A control-X character |
O resultado expandido encuentrase entrecomillado con comilla simple, coma se o signo dólar non estivese presente.
Unha cadea entrecomillada con comillas dobles precedida por un signo dolar ($"...") será traducida dacordo ó LOCALE actual. Se fose C ou POSIX, ignorase o símbolo dolar. Se a cadea é traducida e reemplazada, o reemplazo estará entrecomillado por comilla dobre.
BOS DÍAS sempre souben que o windows era malo, pero iso é por que non vira estos comandos.
[editar] Guións de inicio do Bash
Cando Bash arranca, executa os comandos que se atopan en diferentes scripts. Cando se invoca a Bash coma un shell interactivo pra o inicio dunha sesión (login shell), ou coma un shell no interactivo coa opción --login, en primeiro lugar lee e executa comandos desde o fichero /etc/profile, se existe. Despois, busca ~/.bash_profile, ~/.bash_login, e ~/.profile, en este orden, y lee y ejecuta los comandos desde el primero que existe y es legible. A opción --noprofile pode utilizarse ó comezar un novo shell pra inhibir iste comportamento. Cando un login shell termina, Bash lee e ejecuta os comandos de ~/.bash_logout, se existe.
Cando un shell interactivo que non é un login shell arranca, Bash lee e executa comandos desde ~/.bashrc, s existise. Isto pode evitarse utilizando a opción --norc. A opción --rcfile fichero forzará a Bash a leer e executar comandos desde ficheiro na vez de ~/.bashrc.
Cando Bash arranca de un modo non interactivo, por exemplo pra executar un shell script diferente, busca a variable de entorno BASH_ENV, se existe expande o seu valor, e utilizao coma o nombre do ficheiro pra leer e executar. Bash comportase coma se se executase o seguinte comando:
if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
mais o valor da variable PATH non se utiliza pra buscar o ficheiro.
Se se invoca a Bash co nome sh, intenta replicar o comportamiento das versións antigas de sh, á vez que se mantén a conformidade co estándar POSIX. Cando se invoca coma un login shell interactivo, ou un shell non interactivo coa opción --login, primeiro intenta leer e executar comandos desde /etc/profile e ~/.profile, nesta orde. A opción --noprofile pode utilizarse pra evitar este comportamento. Cando se invoca como un shell interactivo co nome sh, Bash busca a variable ENV, se está definida expande o seu valor, e utiliza o valor expandido coma o nombre dun ficheiro pra leer e executar. Coma un shell invocado coma sh non intenta ler e executar comandos desde nengún outro ficheiro de arranque, e a opción --rcfile non ten efecto. Un shell non interactivo invocado co nome sh non intenta ler nengún outro ficheiro de arranque. Cando se invoca coma sh, Bash entra no modo posix despois de ler os ficheiros de inicio.
Cando se inicia Bash no modo posix, por exemplo coa opción --posix, segue o estándard POSIX pra os ficheiros do incio. Neste modo, os shells interactivos expanden a variable ENV e leense, e execútanse, os comandos desde o ficheiro do cal o nome é o valor da variable expandida. Non se lee nengún outro ficheiro de arranque.
Bash intenta determinar cando está sendo executado por un demo (daemon) do shell remoto, normalmente rshd. Se Bash determina que está sendo executado por rshd, lee e executa comandos desde ~/.bashrc, se este ficheiro existe e é lexible. Non fará isto se se invoca coma sh. A opción --norc pode utilizarse pra evitar iste comportamento, e a opción --rcfile pode utilizarse pra forzar a ler outro ficheiro, pero rshd normalmente non invoca ó shell con istas opcións ou permite que sexan especificadas.
[editar] Enlaces externos
Template:Wikibookspar
- Bash home page
- Bash FAQ
- Bash 3.0 Announcement
- The GNU Bash Reference Manual, (HTML version) by Chet Ramey and Brian Fox, ISBN 0954161777
Guías Bash da Linux Documentation Project:
- Programación bash (en español)
- Bash Guide for Beginners
- BASH Programming - Introduction HOW-TO
- Advanced Bash-Scripting Guide
Outras guías e tutoriais:
- Linux Shell Scripting Tutorial - A Beginner's handbook
- About Shells
- Beginners Bash Tutorial
- Advancing in the Bash Shell tutorial
- Linux Know-How including the Bash Guide for Beginners