bash

De WikiLingua.net


bash  

Captura de pantalla d'una sessió bash, presa en GNU/Linux.
Desarrollador: Projecte GNU
Última versió: 3.2.17 (25 d'Abril, 2007)
S.O.: Multiplataforma
Gènere: CLI
Llicència: GNU
En espanyol: -
Lloc Web: The GNU Bourne-Again SHell

bash és un shell d'Unix (intèrpret d'ordres d'Unix) escrit per al projecte GNU. El seu nom és un acrónimo de b ourne-again shell (un altre shell bourne) — fent un joc de paraules (born-again significa renacimiento) sobre el Bourne shell (sh), que va ser un dels primers intèrprets importants d'Unix. Cap a 1978 l'intèrpret Bourne era l'intèrpret distribuït amb l'Unix Version 7. Stephen Bourne, per llavors investigador dels Laboratoris Bell, va escriure l'intèrpret Bourne original . Brian Fox va escriure l'intèrpret bash en 1987. En 1990, Chet Ramey es va convertir en el seu principal desarrollador. bash és l'intèrpret predeterminat en la majoria de sistemes GNU/Linux, a més de Mac US X Tiger, i pot executar-se en la majoria dels sistemes operatius tipus Unix. També s'ha portat a Microsoft Windows pel projecte Cygwin.

Taula de continguts

[editar] Sintaxis de bash

La sintaxis d'ordres de bash és un superconjunto de la sintaxis de l'intèrpret Bourne. L'especificació definitiva de la sintaxis d'ordres de bash, pot trobar-se en el bash Reference Manual distribuït pel projecte GNU. Aquesta secció destaca algunes de les característiques úniques de bash.

La majoria dels shell scripts (guions d'ordres) Bourne poden executar-se per bash sense cap canvi, amb l'excepció d'aquells scripts de shell Bourne que fan referència a variables especials de Bourne o que utilitzen una ordre interna de Bourne. La sintaxis d'ordres de bash inclou idees preses des del Korn Shell (ksh) i el C Shell (csh), com l'edició de la línia d'ordres, l'historial d'ordres, la pila de directoris, les variables $RANDOM i $PPID, i la sintaxis de substitució d'ordres POSIX: $(...). Quan s'utilitza com un intèrpret d'ordres interactiu, bash proporciona autocompletado de noms de programes, noms d'arxius, noms de variables, etc, quan l'usuari prem la tecla TAB.

La sintaxis de bash té moltes extensions que no proporciona l'intèrpret Bourne. Diverses de les esmentades extensions s'enumeren a continuació.

[editar] Accés als paràmetres

Els scripts de bash reben els paràmetres que li passa la shell com $1, $2, ..., $n. Podem saber quants hem rebut amb el símbol $#.

Per exemple, si el nostre script necessita dos paràmetres posarem:

if [ $# -lt 2 ]; then
   tiro "Necessites passar dos paràmetres."
   exit 0
 fi

[editar] Matemàtiques amb sencers

Una gran limitació de l'intèrpret Bourne és que no pot realitzar càlculs amb sencers sense llançar un procés extern. En canvi, un procés bash pot realitzar càlculs amb sencers utilitzant l'ordre ((...)) i la sintaxis de variables $[...] de la següent manera:

VAR=55             # Assigna el valor sencer 55 a la variable VAR.
 ((VAR = VAR + 1))  # Suma un a la variable VAR.  Observi l'absència del caràcter '$'.
 ((++VAR))          # Una altra forma de sumar un a VAR.  Preincremento estil C.
 ((VAR++))          # Una altra forma de sumar un a VAR.  Postincremento estil C.
 tiro $[VAR * 22]   # Multiplica la variable VAR per 22 i substituye l'ordre pel resultat.
 tiro $((VAR * 22)) # Una altra forma de realitzar el mateix.

L'ordre ((...)) també es pot utilitzar en sentències condicionales, ja que el seu codi de tornada és 0 o 1 depenent de si la condició és certa o falsa:

if ((VAR == I * 3 + X * 2))
 then
         tiro Si
 fi
 
 ((Z > 23)) && tiro Si

L'ordre ((...)) suporta els següents operadors relacionales: '==', '!=', '>', '<', '>=', i '<='.

Un procés bash no pot realitzar càlculs en mengi flotant. Els únics shell Unix capaços d'això són el Korn Shell (versió de 1993) i el zsh (a partir de la versió 4.0).

[editar] Redirecciones d'Entrada/Sortida

La sintaxis de bash permet diferents formes de redirección d'entrada/sortida de les quals el Shell Bourne tradicional manca. bash pot redirigir la sortida estàndard i els fluixos d'error estàndard alhora utilitzant la sintaxis:

ordre &> arxivo

que és més simple que teclejar l'ordre Bourne equivalent, "ordre > arxivo 2>&1". Des de la versió 2.05b, bash pot redirigir l'entrada estàndard des d'una cadena utilitzant la següent sintaxis (denominada "here strings"):

ordre <<< "cadena a llegir com entrada estàndard"

Si la cadena conté espais en blanc, han d'utilitzar-se comillas.

Exemple: Redirige la sortida estàndard a un arxiu, escriu dades, tanca l'arxiu i reinicia stdout

# fa que el descriptor d'arxiu 6 sigui una còpia de stdout (descriptor arxivo 1)
 exec 6>&1
 # obre l'arxiu "test.data" per a escriptura
 exec 1>test.data
 # genera algun contingut
 tiro "data:data:data"
 # recupera stdout original, al fer que sigui una còpia del descriptor d'arxiu 6
 exec 1>&6
 # tanca el descriptor d'arxiu 6
 exec 6>&-

Obre i tanca arxius

# obre l'arxiu test.data per a lectura
 exec 6<test.data
 # llegeix fins al final de l'arxiu
 while read -o 6 dta
 do
   tiro "$dta" 
 done
 # tanca l'arxiu test.data
 exec 6<&-

Captura la sortida d'ordres externes

# executa 'find' i guarda els resultats en VAR
  # busca noms d'arxius que acaben amb la lletra "h"
  VAR=$(find . -name "*h")

[editar] Expressions regulars

Els processos bash 3.0 suporten emparejamiento d'expressions regulars utilitzant la següent sintaxis, reminiscente de Perl:

[[ string = regex ]]

La sintaxis d'expressions regulars és la mateixa que documenta la pàgina de manual regex(3). L'estat de sortida de l'ordre anterior és 0 si la cadena concorda amb l'expressió regular, i 1 si no casen. En les expressions regulars pot accedir-se a les parts delimitadas per parèntesis, utilitzant la variable shell BASH_REMATCH, de la següent manera:

if [[ foobarbletch = 'foo(bar)bl(.*)' ]]
 then
         tiro The regex matches!
         tiro $BASH_REMATCH      -- outputs: foobarbletch
         tiro ${BASH_REMATCH[1]} -- outputs: bar
         tiro ${BASH_REMATCH[2]} -- outputs: etch
 fi

Aquesta sintaxis proporciona un rendiment superior a llançar un procés separat per a executar una ordre grep, perquè l'emparejamiento de les expressions regulars té lloc en el propi procés bash. Si l'expressió regular o la cadena conté un espai en blanc o un metacarácter del shell (com '*' o '?'), ha de ser entrecomillada.

[editar] Escapi amb contrabarra

Les paraules amb la forma $'string' es tracten d'una manera especial. Aquestes paraules s'expandeixen a string, amb els caràcters escapats per la contrabarra reemplaçats segons especifica el llenguatge de programació C. Les seqüències d'escapi amb contrabarra, es decodifican de la següent manera:

Escapis amb contrabarra
Backslash
Escapi
S'expandeix a ...
\a Un caràcter d'alerta (bell)
\b Un caràcter de reculada
\i Un caràcter d'escapi
\f Un caràcter d'alimentació de línia (form feed)
\n Un caràcter de nova línia
\r Un caràcter de tornada de carro
\t Un tabulador horitzontal
\v Un tabulador vertical
\\ Un caràcter contrabarra
\' Un caràcter de comilla simple
\nnn El caràcter de 8 bits el valor del qual és el nombre octal nnn (d'un a tres dígits)
\xHH El caràcter de 8 bits el valor del qual és el nombre hexadecimal HH (un o dos dígits hexadecimales)
\cx Un caràcter control-X

El resultat expandit es troba entrecomillado amb comilla simple, com si el signe $ no estigués present.

Una cadena entrecomillada amb comillas dobles precedida per un signe $ ($"...") serà traduïda d'acord al LOCALE actual. Si fos C o POSIX, s'ignora el símbol $. Si la cadena és traduïda i reemplaçada, el reemplaço estarà entrecomillado per comilla doble.

[editar] Guions d'inici de bash

Quan bash arrenca, executa les ordres que es troben en diferents scripts. Quan s'invoca a bash com un shell interactiu per a l'inici d'una sessió (login shell), o com un shell no interactiu amb l'opció --login, en primer lloc llegeix i executa ordres des de l'arxiu /etc/profile, si existeix. Després, cerca /.bash_profile, /.bash_login, i /.profile, en aquest ordre, i llegeix i executa les ordres des del primer que existeix i és legible. L'opció --noprofile pot utilitzar-se al començar un nou shell per a inhibir aquest comportament. Quan un login shell acaba, bash llegeix i executa les ordres de \/.bash_logout , si existeix.

Quan un shell interactiu que no és un login shell arrenca, bash llegeix i executa ordres des de \/.bashrc , si existís. Això pot evitar-se utilitzant l'opció --norc. L'opció --rcfile arxiu forçarà a bash a llegir i executar ordres des d'arxiu en lloc de \/.bashrc .

Quan bash arrenca d'una manera no interactiva, per exemple per a executar un shell script diferent, busca la variable d'entorn BASH_ENV, si existeix expandeix el seu valor, i ho utilitza com el nom de l'arxiu per a llegir i executar. bash es comporta com si s'executés la següent ordre:

if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi

però el valor de la variable PATH no s'utilitza per a buscar l'arxiu.

Si s'invoca a bash amb el nom sh, intenta replicar el comportament de les versions antigues de sh, alhora que es manté la conformitat amb l'estàndard POSIX. Quan s'invoca com un login shell interactiu, o un shell no interactiu amb l'opció --login, primer intenta llegir i executar ordres des de \/etc/profile i /.profile, en aquest ordre. L'opció --noprofile pot utilitzar-se per a evitar aquest comportament. Quan s'invoca com un shell interactiu amb el nom sh, bash busca la variable ENV, si està definida expandeix el seu valor, i utilitza el valor expandit com el nom d'un arxiu per a llegir i executar. Com un shell invocat com sh no intenta llegir i executar ordres des de cap altre arxiu d'arrencada, i l'opció --rcfile no té efecte. Un shell no interactiu invocat amb el nom sh no intenta llegir ninun un altre arxiu d'arrencada. Quan s'invoca com sh, bash entra en la manera posix després de llegir els arxius d'inici.

Quan s'inicia bash en la manera posix, per exemple amb l'opció --posix, segueix l'estàndard POSIX per als arxius d'incio. En aquesta manera, els shells interactius expandeixen la variable ENV i es llegeixen, i executen, les ordres des de l'arxiu el nom del qual és el valor de la variable expandida. No es llegeix cap altre arxiu d'arrencada.

bash intenta determinar quan està sent executat per un dimoni de shell remot, normalment rshd. Si bash determina que està sent executat per rshd, llegeix i executa ordres des de \/.bashrc , si aquest arxiu existeix i és legible. No farà això si s'invoca com sh. L'opció --norc pot utilitzar-se per a evitar aquest comportament, i l'opció --rcfile pot utilitzar-se per a forçar a llegir un altre arxiu, però rshd normalment no invoca al shell amb aquestes opcions o permet que siguin especificades.

[editar] Enllaços externs

Guies bash de Linux Documentation Project:

Altres guies i tutoriales: