Documentos de Académico
Documentos de Profesional
Documentos de Cultura
NDICE
ndicedeContenidos
1.REPASOCONCEPTOSBSICOSDEUNIX/LINUX.................................................................1 1.1.Elsistemadeficheros...............................................................................................................1 1.1.1.Movindonosporelsistemadeficheros............................................................................2 1.2.Manipulacin...........................................................................................................................3 1.3.Laayudadelsistema................................................................................................................3 1.4.Patrones(metacaracteresdesustitucin).................................................................................4 1.4.1.Igualandouncarctersimplecon?...................................................................................5 1.4.2.Igualandoceroomscaracterescon*..............................................................................5 1.4.3.Igualandoceroomscaracterescon[].............................................................................6 1.4.4.Abreviandonombredearchivoscon{}............................................................................6 1.5.Bsqueda..................................................................................................................................7 1.6.Tiposycontenidosdeficheros................................................................................................7 1.7.Permisos...................................................................................................................................9 1.7.1.Resumendecomandos....................................................................................................11 2.COMANDOSSHELLI................................................................................................................12 2.1.ElsistemaOperativoLinux....................................................................................................12 2.1.1.EstructuraeInterfacesdeLinux......................................................................................13 2.2.Losinterpretesderdenes.....................................................................................................14 2.3.Unasesindetrabajo.............................................................................................................16 2.3.1.Elsistemadearchivos......................................................................................................17 2.3.2.Elshelldeentrada...........................................................................................................18 2.4.Losprocesos.........................................................................................................................19 2.4.1.Algunasherramientasparavigilarprocesos....................................................................20 2.4.2.Metacaracteressintcticos...............................................................................................21 2.4.3.rdenesparaelcontroldetrabajos.................................................................................26 2.5.Metacaracteresdeentrada/salidaodedireccin...................................................................29 2.6.Empaquetadoycompresindearchivoscontarygzip.........................................................34 2.7.Ejercicios...............................................................................................................................38 3.COMANDOSSHELLII...............................................................................................................42 3.1.Historiaderdenes................................................................................................................42 3.2.Autocompletarconeltabulador............................................................................................46 3.3.Metacaracteres.......................................................................................................................46 3.3.1.Metacaracteressintcticos...............................................................................................47 3.3.2.Metacaracteresdenombredearchivos...........................................................................47 3.3.3.Metacaracteresdecitacin..............................................................................................48 3.3.4.Metacaracteresdeentrada/salidaodedireccin.............................................................50 3.3.5.Metacaracteresdeexpansin/sustitucin........................................................................50
I
NDICE
3.4.Losalias.................................................................................................................................51 3.4.1.Definicinyeliminacindealias....................................................................................51 3.4.2.Listarladefinicindelosaliasexistentes......................................................................52 3.4.3.Renombraroredefinirunaordenexistente....................................................................52 3.4.4.Crearunanuevaorden...................................................................................................52 3.5.Variables................................................................................................................................53 3.5.1.Variablesdeentornoyvariableslocales..........................................................................53 3.5.2.Creacindevariables.....................................................................................................54 3.5.3.Personalizarelprompt....................................................................................................56 3.5.4.Variablesdeentornointernas..........................................................................................58 3.5.5.Exportarvariables...........................................................................................................59 3.6.Scripts....................................................................................................................................59 3.6.1.Primerospasosconscripts..............................................................................................60 3.6.2.Variableenlosscripts.....................................................................................................62 3.6.3.Pasodeargumentosalosscripts.....................................................................................64 3.7.Ejercicios...............................................................................................................................68 4.PROGRAMACINBASHI.........................................................................................................71 4.1.Variablescontipo...................................................................................................................71 4.2.Expresionesaritmticas.........................................................................................................73 4.2.1.Expansindelshell$((expresin))..................................................................................74 4.2.2.SimilitudconlasexpresionesaritmticasC...................................................................75 4.2.3.Elcomandointernolet....................................................................................................75 4.3.Lassentenciascondicionales.................................................................................................76 4.3.1.Lassentenciasif,elifyelse.............................................................................................76 4.3.2.Loscdigosdeterminacin............................................................................................77 4.3.3.Lasentenciaexit..............................................................................................................78 4.3.4.Operadoreslgicosycdigosdeterminacin................................................................78 4.3.5.Testcondicionales...........................................................................................................79 4.3.6.Ifaritmtico....................................................................................................................85 4.4.Elbuclefor............................................................................................................................85 4.5.Bucleswhileyuntil...............................................................................................................88 4.6.Entradaysalidadetexto........................................................................................................90 4.6.1.Elcomandointernoecho.................................................................................................90 4.6.2.Elcomandointernoprintf...............................................................................................92 4.6.3.Elcomandointernoread.................................................................................................95 4.7.Ejercicios...............................................................................................................................97 5.PROGRAMACINBASHII........................................................................................................99 5.1.Lasentenciacase....................................................................................................................99 5.2.Lasentenciaselect...............................................................................................................100 5.3.Lasentenciashift.................................................................................................................102
II
NDICE
III
1. REPASOCONCEPTOSBSICOSDEUNIX/LINUX
1.1. Elsistemadeficheros
Todosistemaoperativonecesitaguardarmultituddearchivos:desdelosdelaconfiguracindel sistema,losdelog,losdelosusuarios,etc.Engeneral,cadasistemaoperativoutilizasupropio sistema de ficheros, caracterizndolo en muchos aspectos como pueden ser el rendimiento, seguridad,fiabilidad,etc. Loprimeroquedebemostenerclaroesquetodoelsistemadeficherospartedeunamismaraz, alacualnosreferiremosconelcarcter'/'.Eselorigendetodoelsistemadeficherosysloexiste una. Para organizar los ficheros adecuadamente, el sistema proporciona lo que llamaremos directorios(ocarpetas),dentrodelascualespodemosponerarchivosymsdirectorios.Deesta formaconseguimosunaorganizacinjerrquicacomolaquevemosenlasiguientefigura:
Figura1.1:Sistemadearchivos
Elcomandobsicoparacrearundirectorioesmkdir.Porsuparte,siqueremoscrearunarchivo sepuedeutilizarcualquiereditordetexto,comosevermsadelante.
1.1.1. Movindonosporelsistemadeficheros
Para movernos por la estructura de directorios debemos utilizar los comandos para listar contenidos y cambiar de carpeta. Si queremos ver lo que hay en el directorio donde estemos situadospodemoslistarloscontenidosutilizandoelcomandols.Debemostenerencuentaquepor defecto el comando nonos muestra losarchivos queempiezan por unpunto.Paracambiar de directoriopodemosutilizarelcomando cd.Sinolepasamosningnparmetro,pordefectonos situarennuestrodirectoriohome;silepasamoscomoargumentos..,nossituareneldirectorio superior. Generalmente, se le suele indicar dnde queremos ir, pasndolo de forma absoluta o relativa.Deformarelativasignificaquepartiremosdeldirectoriodondeestemosenelmomentode ejecutar el comando. Por ejemplo, si estamos en el directorio /Directorio1/Directorio1_1/ y queremosiral/Directorio3/,deberamosintroducirelsiguientecomando:cd../../Directorio3. Deformaabsolutasiemprepartimosdelaraz,demaneraqueelcomandoqueutilizaramosparael ejemploanteriorsera:cd/Directorio3.Parasaberenqudirectorioestamospodemosutilizarel comandopwd.
1. Visualiceelcaminocompletodeldirectorioactual. 2.Visualicelosficherosdeldirectorioactual. 3.Cree la siguiente estructura de directorios dentro de su directoriohome. /curso0607 /pract1/pract2/pract3
1.2.- Manipulacin
1.2. Manipulacin
Ahora que ya sabemos movernos correctamente por la jerarqua de directorios tambin necesitamossabercmocopiar,eliminarymanipularcorrectamenteotrosaspectosdelosficheros. Elcomandormeselqueseencargadeeliminarlosarchivosqueleindiquemos.Paraeliminarun directorio,podemosutilizarelcomandormdir,aunquesloloborrarcuandosteestvaco.Para copiararchivosdeunlugaraotrotenemoselcomando cp,conelcualsiempredebemosindicarleel ficheroodirectorioorigenyellugaronombrededestino,aunqueseaeneldirectorioactual.Sien lugardecopiarlosarchivosqueremosmoverlosdesitiopodemosutilizarelcomando mv.Este comandotambinseutilizapararenombrararchivos.
4.Crea en el directorio pract2 un archivo que se llame apuntes.txtyotroquesellamaejercicios.txt 5.Escribealmenos5lneasencadauno 6.Copiaelficheroapuntes.txteneldirectoriopract3 7. Muevaelficheroejercicios.txtaldirectoriopract1 8.Borraelarchivoapuntes.txtdeldirectoriopract2 9.Borraeldirectoriopract2 10.Cmbialeelnombrealficheroapuntes.txpornotas.txt
1.3. Laayudadelsistema
Todosloscomandosqueveremostienenmultituddeopcionesyparmetrosdiferentesquenos permitenmanipularlosdelaformaquequeramos.Desdeelprincipiosetuvomuyencuentaquees imprescindible contar con una buena documentacin para todos ellos. Igualmente, toda esta informacin tambin es necesaria para los ficheros de configuracin del sistema, las nuevas aplicacionesqueutilizamos,etc.Esporestoqueelmismosistemaincorporaunmecanismode manuales con el que podemos consultar casi todos los aspectos de los programas, utilidades, comandosyconfiguracionesexistentes.Elcomandomsutilizadoesel man,quenosenseael manual del programa que le indiquemos como parmetro. Por defecto esta documentacin es mostradautilizandoelprogramaless,conelcualpodemosdesplazarnoshaciaadelanteyhaciaatrs conlasteclasdeAVPGyREPG,buscarunapalabraconelcarcter/seguidodelapalabray
3
qparasalir. Sihaymsdeunmanualdisponibleparaunamismapalabra,podemosespecificarlopasndole el nmero correspondiente de la seccin deseada antes de la palabra, por ejemplo man 3 printf. Como los otros comandos, man tambin tiene multitud de opciones diferentes documentadasensupropiomanualmanman.Unadeestasopcionesquenospuedeirmuybien en las ocasiones que no sepamos exactamente el programa que estamos buscando es k' (el comandoaproposhacecasiexactamentelomismo).Conmankseguidodeunapalabraque haga referenciaalaaccinquequeramosrealizarse buscar por entretodoslosmanuales del sistemaysemostrarnlosqueensudescripcinonombreaparezcalapalabraindicada.Deesta forma,podemosencontrartodolosqueramossintenerquerecurriraningnlibrooreferencia externaalsistema. Sielmanualnonosproporcionatodalainformacinquenecesitemostambinpodemosusarel comandoinfo,queeslomismoqueelmanualperoanmsextendido.Silonicoquequeremoses tenerunabrevereferenciadeloquehaceundeterminadoprogramapodemosutilizarelcomando whatis.
11.Pidaayudasobreloscomandosmarcadosennegrita 12.Busquecomandosquepermitancomparar(cmp).
1.4. Patrones(metacaracteresdesustitucin)
Unmecanismomuytilquenosproporcionaelsistemasonlospatterns(patrones).Hastaahora hemos visto como aplicar ciertas operaciones sobre un determinado archivo. Cuando estamos manipulandounsistema,enmuchoscasosnosinteresar aplicaralgunadelasoperacionesque hemos visto pero sobre un grupo grande de ficheros. Los patrones nos permitirn aplicar las operacionesquequeramosespecificando,enunasolainstruccin,variosficherosquecumplancon unaseriedecaractersticasespecificadas.Debemosverloscomoplantillasdenombres,quenos permitenhacerreferenciadeformaabreviadaaunaseriedearchivoscuyosnombressiguenun patrn.LaTabla1.1muestraestosmetacaracteres.
Metacaracter ? * []
Descripcindelafuncin Comodnacualquiercarctersimple Igualacualquiersecuenciadeceroomscaracteres Designauncarcterorangodecaracteresque,comounaclase, sonigualadosporunsimplecarcter.Paraindicarunrango, mostramoselprimeryelltimocarcterseparadosporunguin ().Conelsmbolo!indicamosnegacin. Abreviarconjuntosdepalabrasquecompartenpartescomunes Seusaparaabreviarelcaminoabsoluto(path)deldirectorio home
Tabla1.1:Patrones
{} ~
1.4.1. Igualandouncarctersimplecon?
Esmuyfrecuentecreararchivosconalgnpatrncomopartedesunombre.Porejemplo,para realizarunasprcticas,nombramoscadaarchivocomopractica_1.txt,practica_2.txt,practica_3.txt, etc.Siquisiramosobtenerinformacindelosarchivosconls,podramosdarlasrdenes:
$ls lpr actica_1 .txt practica_ 2.txt p racti ca_3.t xt rwrr1mluquemluque3Oct119:44practica_1.txt rwrr1mluquemluque3Oct119:44practica_2.txt rwrr1mluquemluque3Oct119:44practica_3.txt
1.4.2. Igualandoceroomscaracterescon*
El carcter especial * iguala cero o ms caracteres. Por ejemplo, los archivos listados
5
anteriormente,podemosverlosusandolacadenadeigualacinpractica_*:
$lsl p ractic a_* rwrr1mluquemluque3Oct119:44practica_1.txt rwrr1mluquemluque3Oct119:44practica_2.txt rwrr1mluquemluque3Oct119:44practica_3.txt
RecordadqueenLinuxnoexisteelconceptodenombreyextensinalahoradenombrar archivos.Elpuntoesuncarctermspermitidoenelnombredeunarchivo.
1.4.3. Igualandoceroomscaracterescon[]
Loscorchetesdefinenunalista,oclasedecaracteres,quesepuedenigualarconunslocarcter. Acontinuacin,ilustramosalgunasformasdecaracterizargruposdearchivos: [AZ]* *[aeiou] tema.*[13579] tema.0[13] [AZaz][09]* Igualatodoslosarchivosquecomienzanconunaletramayscula. Igualacualquierarchivoquefinaliceconunavocal. Igualalostemasquefinalizanconunnmeroimpar Igualatema.01,tema.02,tema.03. Iguala los archivos que comienzan con una letra (mayscula o minscula),seguidadeundgito,yceroomscaracteres. [!AZ]* Igualalosarchivosquenocomiencenporunaletramayscula
1.4.4. Abreviandonombredearchivoscon{}
Elusodelasllaves({}),solasocombinadasconlosanteriorescaracteresespeciales(?,*,[]),nos
6
vanapermitirformasexpresionesdenombresdearchivosmscomplejas.Lasllavescontienenuna listadeunoomscaracteresseparadosporcomas.Cada temdelalistaseutilizaenturnopara expandirunnombredearchivoqueigualalaexpresincompletaenlaqueestninmersaslasllaves. Porejemplo, a{f,e,d}b seexpandeen afb,aeb y adb,enesteordenexactamente.Las llavessepuedenutilizarmsdeunavezenunaexpresin.Laexpresin s{a,e,i,o,u}{n,t}se expandeensan,sen,sin,son,sun,sat,set,sit,sotysut.
1.5. Bsqueda
Otrotipodeoperacinmuy tileslabsquedadeficheros.Tenemosvarioscomandosquenos permiten realizarbsquedasdediferentestipossobretodoslosficheros delsistema. find es el comando ms verstil para realizar esta accin. locate es otro comando pero, a diferencia del anterior, utilizaunabasededatosinternaqueseactualizaperidicamenteynospermitehacer bsquedasbastantemsrpidas.Paraacabarconloscomandosdebsqueda, whereisestorientado alabsquedadelosarchivosbinarios(losejecutables),deayudaolosdecdigofuentedeun determinadoprograma.
17.Busca todos los archivosqueempiecenpormeneldirectorio /usr/bin 18.Buscalalocalizacindelcomandols
1.6. Tiposycontenidosdeficheros
Utilizarlaextensinparadeterminareltipodeunarchivonoesunsistemamuyeficazyaque cualquierapuedecambiarlaygenerarconfusionesyerroresenelsistema. Losarchivosquetenemosennuestrosistemapuedenserdemuchostiposdiferentes:ejecutables, detexto,dedatos,etc.Adiferenciadeotrossistemas,queutilizanlaextensindelarchivopara determinar de qu tipo son, GNU/Linux utiliza un sistema denominado de magic numbers, determinandoconunnmeromgicoeltipodeficherosegnsusdatos.Elcomando file noslo indica.
$/tm p/pr ueb a$f ile* practica_1.txt:ASCIItext practica_2.txt:ASCIItext practica_3.txt:ASCIItext 14.Miradequetiposonlosarchivoscontenidoseneldirectorio pract3 15.Averigua de que tipo son los archivos que empiezan por m en /usr/bin
losarchivosacabadosen.c
Con cut podemossepararencamposelcontenidodecadalneadelficheroespecificandoqu carctereselseparador,muytilentareasdeadministracindelsistemaparasuautomatizacin.De igualforma,conpastepodemosconcatenarlalneasdediferentesficheros.Tambinpodemoscoger undeterminadonmerodelneasdelprincipioofindeunarchivoconloscomandosheady tail respectivamente.Con wc podemoscontarelnmerodelneasopalabras,lamximalongitudde lneadeunfichero,etc.
17.Buscalaslabamaenelficheroapuntes.txt 18.Visualizalasprimeraslineasdelficheroasignatura.txt 19.Visualizalasultimaslneasdelficheroapuntes.txt
Finalmente,paraacabarconestaseccindemanipulacindeficheroslonicoquenosfaltapor ver es cmo comparardiferentesarchivos. Igualqueconlasotrasoperaciones,tenemosvarios comandos que nos permiten hacerlo. diff, cmp y comm realizan comparaciones de diferentes formasymtodosenlosficherosquelesindiquemos.
1.7. Permisos
Encualquiersistemaoperativomultiusuarionecesitamosquelosficherosqueguardamosen nuestro disco puedan tener una serie de propiedades que nos permitan verlos, modificarlos o ejecutarlosparalosusuariosquenosotrosdefinamos.Aunquehayvariasalternativasparahaceresto UNIXutilizaelsistemaclsico,quecombinadocontodoslosmecanismosdegestindeusuariosy grupos nos permite cualquier configuracin posible. La idea es definir, para cada fichero o directorio,aqu usuarioygrupoperteneceyqu permisostieneparacadaunodeellosyparael restodeusuariosdelsistema.Ejecutando``lsl''veremoscomoporcadaarchivodeldirectorio dondeestemosapareceunalneaparecidaalasiguiente:
rwxrxrx1user1grupo1128931Feb192000gpl.txt
1.7.- Permisos
apareceelcarcter,mientrasqueporlosdirectoriosapareceunad'. Caracteres2,3,4:nosindican,respectivamente,lospermisosdelectura,escriturayejecucin para el propietario del fichero. En caso de no tener el permiso correspondiente activado encontramoselcarcter``''ysino``r'',``w''o``x''segnsilopodemosleer(Read),escribir(Write) oejecutar(eXecute). Caracteres5,6,7:estoscaracterestienenexactamenteelmismosignificadoqueanteriormente pero haciendo referenciaalospermisos dadosparalosusuariosdelgrupoalquepertenece el fichero. Caracteres8,9,10:igualqueenelcasoanteriorperoparatodoslosotrosusuariosdelsistema.
20.Determinequepermisostienenlosarchivosdelosdirectorios pract1,pract2,pract3
Para cambiarlospermisosdeundeterminadoarchivopodemosutilizarelcomando chmod. Debemos tener en cuenta que slo el propietario del archivo (o el root) puede cambiar estos permisosyaquesinotodoelmecanismonotendraningnsentido.Lospermisosseindicanconun nmerodetrescifrascomprendidoentreel000yel777,dondecadaunadelascifrascodificalos permisos (lectura, escritura y ejecucin) asociados al propietario del archivo, al grupo al que perteneceelarchivoyalrestodeusuarios,respectivamente.Algunosejemplos
744=111100100=rwxrr 777=111111111=rwxrwxrwx 654=110101100=rwrxr
10
1.7.- Permisos
1.7.1. Resumendecomandos
EnlaTabla1.2sepuedenverlamayoradeloscomandosmencionadosanteriormente.
Comando apropos cat cd cmp,diff cp chgrp chmod chown file find grep head info less
Descripcin informasobreuncomando visualizaelcontenidodeun fichero cambiadedirectorio comparaficheros copiaarchivos cambiaelgrupodeunarchivo cambialospermisosdeun archivoodirectorio cambiaelpropietariodeun archivo indicaeltipodefichero bsquedadeficheros buscaunpatrnenunfichero visualizanlineasdelcomienzo delfichero idemmanperomsextenso igualacat
Comando locate ls man mdkir more mv pwd rm rmdir tail umask wc whatis whereis
Descripcin bsquedadeficheros listaelcontenidodeundirectorio enseaelmanualsobreun comando creaundirectorio igualacat muevearchivos muestraeldirectorioenquenos encontramos borraarchivos borradirectorios visualizanlineasdelfinaldel fichero cambialospermisospordefecto deunarchivoalsercreado cuentalneas/palabras brevereferenciasobreun comando bsquedadearchivosbinarios
Tabla1.2:Comandosmsusuales
11
2. COMANDOSSHELLI
2.1. ElsistemaOperativoLinux
Linuxesun Unixlibre,esdecir,unsistemaoperativo,comoelWindowsoelMSDOS(sin embargo,adiferenciadeestosyotrossistemasoperativospropietarios,hasidodesarrolladopor milesdeusuariosdecomputadoresatravsdelmundo,yladesventajadeestosesqueloquetedan esloquetuobtienes,dichodeotraformanoexisteposibilidadderealizarmodificacionesnide sabercomoserealizdichosistema),quefuecreadoinicialmentecomounhobbieporunestudiante joven,LinusTorvalds,enlauniversidaddeHelsinkienFinlandia,conasistenciaporungrupode hackersatravsdeInternet.LinuxtenaunintersenMinix,unsistemapequeooabreviadodel UNIX(desarrolladoporAndyTanenbaum);ydecididoadesarrollarunsistemaqueexcedi los estndaresdeMinix.Querallevaracabounsistemaoperativoqueaprovechaselaarquitecturade 32bitsparamultitareayeliminarlabarrerasdeldireccionamientodememoria. Torvaldsempezescribiendoelncleodelproyectoenensamblador,yluegocomenz aaadir cdigoenC,locualincrementlavelocidaddedesarrollo,ehizoqueempezaraatomarseenserio suidea. Comenzsutrabajoen1991cuandorealizlaversin0.02,lacualnosedioaconocerporqueni siquieratenadriversdedisquete,ademsdellevarunsistemadealmacenamientodearchivosmuy defectuoso.Trabajconstantementehasta1994enquelaversin1.0delncleo(KERNEL)deLinux seconcret.Actualmente,laversincompletamenteequipadaesla2.6.18.1(versindeoctubrede 2006),yeldesarrollocontina(sepuedenconsultarenkernel.org). LinuxtienetodaslasprestacionesquesepuedenesperardeunUnixmodernoycompletamente desarrollado: multitarea real, memoria virtual, bibliotecas compartidas, carga de sistemas a demanda,compartimiento,manejodebidodelamemoriaysoportederedesTCP/IP. LapartecentraldeLinux(conocidacomoncleookernel)sedistribuyeatravsdelaLicencia PblicaGeneralGNU,loquebsicamentesignificaquepuedesercopiadolibremente,cambiadoy
12
distribuido, pero no es posible imponer restricciones adicionales a los productos obtenidos y, adicionalmente,sedebedejarelcdigofuentedisponible,delamismaformaqueestdisponibleel cdigodeLinux.AncuandoLinuxtengaregistrodeCopyright,ynoseaestrictamentededominio pblico,lalicenciatieneporobjetoasegurarqueLinuxsigasiendogratuitoyalavezestndar. Por su naturaleza Linux se distribuye libremente y puede ser obtenido y utilizado sin restriccionesporcualquierpersona,organizacinoempresasqueaslodesee,sinnecesidaddeque tenga que firmar ningn documento ni inscribirse como usuario. Por todo ello, es muy difcil establecer quienesson losprincipalesusuariosdeLinux.Noobstantesesabequeactualmente LinuxestsiendoutilizadoampliamenteensoportarserviciosenInternet,loutilizanUniversidades alrededor del todo el mundo para sus redes y sus clases, lo utilizan empresas productoras de equipamientoindustrialparavendercomosoftwaredeapoyoasumaquinaria,loutilizancadenasde supermercados,estacionesdeservicioymuchasinstitucionesdelgobiernoymilitaresdevarios pases.Obviamente,tambinesutilizadopormilesdeusuariosensuscomputadorespersonales.El apoyomsgrande,sinduda,hasidoInternetyaqueatravsdeellasehapodidodemostrarquese puedecrearunsistemaoperativoparatodoslosusuariossinlanecesidaddefineslucrativos.
2.1.1. EstructuraeInterfacesdeLinux
Comomuchossistemas,Linuxpuedeversecomounapirmide(Figura2.1).Enlabasetenemos elhardware,ysobre l,elsistemaoperativo.Sufuncinescontrolarelhardwareysuministrarla interfazdellamadasalsistemaatodoslosprogramas.Estainterfazpermitealosusuarioscreary gestionar procesos, archivos, y otros recursos. Como las llamadas al sistema deben hacerse en
13
Figura2.1:LascapasdelsistemaUNIX
Elobjetivodenuestrasprcticasesaprenderamanejarlainterfazdeusuariomedianteelusode rdenesyshell.
2.2. Losinterpretesderdenes
Unintrpretede rdenes,oshellenlaterminologaLinux,est construidocomounprograma normaldeusuario.Estotienelaenormeventajadequepodemoscambiardeintrpretede rdenes segnnuestrasnecesidadesopreferencias.Existendiferentesshells:elBourneAgainShell(bash), elTCshell(tcsh),yelZshell.EstosshellsnosonexclusivosdeLinux,sedistribuyenlibrementey puedencompilarseencualquiersistemaUNIX.Podemosverlosshelldelosquedisponenuestro sistemamirandoenelarchivo/etc/shells. Elshellesunprogramaquebsicamenterealizalassiguientestareas:
for(;;){ imprimeindicadorderdenes; leelalneadeordenes; analizalalneadeordenes(arg0,arg1,...,>,<,|,&,...); preparaentornosegnloqueapareceenlneadeordenes; creaunprocesoparaejecutarorden;
14
Cadashell,ademsdeejecutarlasrdenesdeLINUX,tienesuspropias rdenesyvariables,lo queloconvierteenunlenguajedeprogramacin.Laventajaquepresentafrenteaotroslenguajeses sualtaproductividad,unatareaescritaenellenguajedelshellsueletenermenoscdigoquesiest escritaenunlenguajecomoC. RespectoacuandoutilizarelshellycuandoutilizarotrolenguajedeprogramacincomoC, indicarcomorecomendacingeneralquedebemosutilizarelshellcuandonecesitemoshaceralgo conmuchosarchivos,odebamosdehacerlamismatarearepetitivamente.Nodeberamosusarel shellcuandolatareaseamuycompleja,requieragraneficiencia,necesitedeunentornohardware diferente,orequieradiferentesherramientassoftware. Respecto alas rdenes,enelbash(elquenosotrosvamosautilizarenprcticas)podemos encontrarlossiguientestipos: 1.Alias:sonabreviacionesparardenesexistentesquesedefinendentrodelamemoriadel shell. 2.Ordenesempotradas:rutinasimplementadasinternamenteenelshell. 3.Programasejecutables:programasqueresidenendisco. Cuandoelshellest preparadoparaejecutarunaorden,evalaeltipodeordensegnelorden queapareceenlalistaanterior:compruebasiesunalias;sino,siesunaordenempotrada;ypor ltimo,unprogramaejecutable(eneste ltimocasolaeficienciaesmenorpueshayqueaccedera discoparalocalizarelejecutabledelaorden).Portanto,sitenemosunaliasconelmismonombre queunprogramaejecutable,primeroejecutaraelalias.
15
Lospropiosshellsecomportancomounaorden,esdecirsepuedenejecutar.
Miradequeshellsdisponeelsistemayentraenalgunadeellas. Entrarenunashell=nombredelashell(lasshellseencuentran en/bin/) Salirdeunashell=exit,oCtrl+D
2.3. Unasesindetrabajo
Cuandoarrancamoselsistema,trasmuchosmensajesdeinicializacin,apareceunapantalla grficaquenospedirlassiguienteinformacin
login:i62xxxx password:
En este momento, el programa /bin/login verifica nuestra identidad comprobando el primer campodelarchivo/etc/passwdquecontienenuestronombreusuario.Sinuestronombreestaall, compara el passworddado,opalabracalve,conlaformaencriptadadelmismoquehayen el archivo/etc/shadow.Unavezverificado,elprogramaloginestableceelentornodetrabajoquese pasar alshell,esdecir,seasignanalasvariablesHOME,SHELL,USER,yLOGNAMElos valoresextradosdelarchivo/etc/passwd.Despus,secreaelshelldeentradaologinshell,conlo quepodemosiniciarlasesindetrabajo. Lapalabraclavedebemantenerseensecretoparanuestraproteccinycambiarseconcierta frecuencia(almenosdosvecesalao).Podemoscambiarlaclavedeaccesoconlaordenpasswd. Unavezenelsistema,disponemosdeunmanualenlneaparaconsultarlasintaxisyopciones de sus rdenes, e incluso algunos ejemplos de como se utiliza. El manual en lnea se puede consultarconlaordenman,cuyasintaxises:
man[opciones][seccin]orden
16
manls
Buscalaspginasdeayudarelacionadasconlosprogramasshell
2.3.1. Elsistemadearchivos
Figura2.2:ElsistemadearchivosdeLinux
Los directorios que aparecen en un sistema Linux pueden variar de unas instalaciones, y versiones, a otras, pero casi siempre encontraremos algunos directorios comunes a todos los sistemas.LamayoradelossistemassiguenelestndarFHSquedeterminadondedebencolarselos ficherossegnsutipoyuso.Porejemplo,ydeformasimplista:
/binDirectorioconprogramasejecutablesdelsistema /bootImagendelsistema /devDirectoriodedispositivos /etcDirectoriodearchivosdeconfiguracin /homeDelcuelganlosdirectoriosdelosusuarios /libBibliotecasdeprogramacinestndares /sbinOrdenesdeadministracindelsistema /tmpDirectorioparaarchivostemporales /usrDirectoriodeprogramas /usr/binDirectoriodeprogramasejecutablesdeaplicacin /usr/X11ArchivosdelsistemadeventanasX /usr/libArchivosdeconfiguracindepaquetesybibliotecas /usr/local/binOrdenesaadidaslocalmente /usr/manPginasdemanualenlneadesistema /usr/src/linuxArchivosfuentesdelkerneldeLinux /varDesbordamientoparaalgunosarchivosgrandes ...
2.3.2. Elshelldeentrada
Suponiendounainstalacingeneral,sideseamostrabajarcon bash deberemosvercualesel shelldeentradadelsistemay,sinoeseldeseado,cambiarlodeformatemporalopermanente.
18
Determinacindelshelldeentrada Cuandoentramosalsistemadespusdedarnuestronombredeusuarioynuestracontraseao palabraclave,Linuxiniciaunshellpordefectoqueeselquenosmuestraelindicadorderdenesde lasesin.Este shelldeentrada sedenomina loginshell.Eseladministradordelsistemaelque estableceesteshellcuandocreaunusuario. Cmosabemoscualeselshellasignadopordefecto?Cuandoseiniciaelshell,esteasignaa unavariableelvalordelshellactual(enlasprcticassiguienteshablaremosdetenidamentedelas variables). Esta variable se llama $SHELL. Podemos ver el valor de la variable con la orden empotradaecho:
echo$SHELL bin/tcsh
Averiguacualeselshellasignadoatusesindetrabajo
2.4. Losprocesos
El hecho que el sistema operativo sea multitarea implica que podemos lanzar ms de un programaalavez.Unprocesonoesmsqueunprogramaoaplicacincargadoenmemoriay ejecutndose.AunquenuestroordenadorslodispongadeunaCPU,elsistemaoperativoseencarga derepartireltiempodeprocesamientodelamismaparaquevariosprocesospuedanirrealizando susoperaciones,dandolasensacinqueseestnejecutandotodosalavez.
19
2.4.1. Algunasherramientasparavigilarprocesos
Laformahabitualdeverelestadodenuestrosistemaesmedianteelusodeherramientasque permitenvigilarlaejecucindelosprocesos.EnLinux,estasherramientasestncontenidasenel paquete procps.Entre stasencontramos: top,vmstat,free,uptime, w,,etc.Estasherramientas utilizanelpseudosistemadearchivos /proc paraobtenerlainformacin.EnelcasodeRedHat, algunasherramientastambinestndisponiblesenlosentornosdeventanas,comoeselcasode ktop,kpmyprocinfoenkde,gtopengnome. Comprobacindelosdispositivos Elpseudosistemadearchivos/procpermiteconsultarlosdispositivosreconocidosporelkernel deLinux.Lasiguienteordennosmuestrapartedelainformacinquepodemosobtenerdeestetipo:
cat/proc/cpuinfo
#informacinsobreelprocesador
ps,sinopcionesniargumentos,dainformacinsobrelosprocesosdelasesinactual.
Muestra los porcentajes de uso de la CPU de los procesos del sistema Pruebaelcomandotop
2.4.2. Metacaracteressintcticos
Unavezaprendidocomoutilizaralgunosdeloscomandosdelsistema,esmuyprobablequeen algunos casos nos interese utilizarlos de forma simultnea para agilizar ms las acciones que queramosrealizar.Losmetacaracteressintcticosnosayudanenestesentido. SirvenparacombinarvariasrdenesdeLINUXyconstruirunanicaordenlgica.Suministran una forma de ejecucin condicional basada en el resultado de la orden anterior. La Tabla 2.1 muestraestoscaracteresydaunadescripcindesufuncin.
21
LosmetacaracteressintcticospermitenmaterializarlafilosofadetrabajodeLINUXdecajade herramientas: dadas las ordenes que necesitamos para realizar un trabajo, los metacaracteres sintcticospermitencomponerlas("pegarlas")pararesolverlo.Estafilosofaesengranmedidala responsabledequelas rdenesdeLINUXrealicenfuncionesmuyconcretas,yseanparcasendar informacinalusuario. Metacarcter ; | Descripcindelafuncin Separadorentrerdenesqueseejecutansecuencialmente Separacin entre rdenes que forman parte de un cauce (pipeline).Lasalidadelaordendelaizquierdadelseparador eslaentradadelaordendeladerechadelseparador. Seusanparaaislarordenesseparadaspor; |.Lasordenes dentro de los parntesis, ejecutadas en su propio shell, son tratadas como una nica orden. Incluir un cauce dentro de parntesis,nospermiteasuvezincluirloenotroscauces. Indicadordetrabajoensegundoplano(background).Indicaal shellquedebeejecutareltrabajoensegundoplano. Separadorentrerdenes,dondelaordenquesigueal||slose ejecutasilaordenprecedentefalla. Separadorentreordenes,enlaquelaordenquesigueal&&se ejecutaslosilaordenprecedentetienexito.
Tabla2.1:Metacaracteressintcticos
()
& || &&
Uniendordenescon; Elusodelpuntoycoma(;)permiteescribirdosomsrdenesenlamismalnea.Lasrdenesse ejecutansecuencialmente,comosisehubiesendadoenlneassucesivas.Enprogramasshell,se utiliza por razones estticas (permite una asociacin visual entre ordenes relacionadas). En el indicadorde rdenes,permiteejecutarvariasordenessintenerqueesperaraquesecompleteuna ordenparaintroducirlasiguiente. Enelejemplosiguiente,utilizamoslaordenpwdquenospermiteverelcaminoabsolutodel directoriodetrabajoactual,ylaordencd(paracambiardedirectorio).
22
$pwd /home/in1xxxxxx $cd so2006 ;ls #Cambiamosdedirectorioyhacemosls. miprograma1 miprograma2 $pwd /home/in1xxxxx/so2006
Creandocaucescon| Antesdeverloscauces,debemoscomentaralgosobreelentornodeejecucindelosprogramas enLINUX.Partedelentornodeejecucindeunprogramasonlosarchivosqueutiliza.Cuandoel sistema operativo crea un proceso, le abre tres archivos: la entrada estndar (stdin), la salida estndar(stdout)yelerrorestndar(stderr),quesecorrespondenconlosdescriptoresdearchivo(o handles)0,1y2,respectivamente(verFigura2.3).Pordefecto,estosarchivossecorrespondencon eltecladoparalaentradaestndar,ylapantallaparalasalidayerrorestndares,perocomoveremos enbreve,estasasociacionessepuedencambiar.
Figura2.3:Entrada,salidayerror,estndares
23
Qu debemos hacer si queremos obtener esta misma informacin pero ordenada alfabticamente?Lasolucinessencilla,usarlaordensortquesirveparaclasificar.
$who|sort#Lasalidadewhoseutilizacomoentradadesort luistty6May109:00 mariatty2May1013:35
Quhaocurrido?Lasalidadewhosehapasadocomoentradaalaordensort.Estonosilustra, adems,quelasrdenesdeLinuxestnconstruidassiguiendoelsiguienteconvenio:cuandoenuna ordennoseespecificanarchivosdeentraday/osalida,elsistematomapordefectolaentradao salida estndar, respectivamente. Por ejemplo, qu ocurre si ejecutamos sort sin argumentos? Sencillo,seordenalaentradaestndaryseenvaalasalidaestndar.
sort<opciones><fichero>
Pruebaelcomandosortsinargumentos.RecuerdaqueCtrl+dindica findearchivo
Combinadoordenescon() Enocasiones,necesitaremosaislaruncauce,ounasecuenciadepuntoycoma,delrestodeuna lneade rdenes.Parailustrarlo,vamosausarlasordenes date,quenosdalafechayhoradel sistema,y la orden wc,quenos permiteconocercuantaslneas,palabrasycaracteres, tiene el archivo que se pasa como argumento. Por ejemplo, las siguientes rdenes tienen resultados diferentes:
$date;who|wc#ejecutadate;ejecutawhocuyasalidapasaawc WedOct1110:12:04WET1995 1531 $(date;who)|wc#ejecutadateywho,sussalidassepasanawc
24
21264 Porqu?
Ejecutandoordenesensegundoplanocon& Linuxpermitedosformasdeejecucinderdenes:
rdenesnoaparecehastaquehafinalizadolaordenquemandamosejecutar.Porejemplo, lasrdenesquehemosejecutadohastaahora.
Ejecucinensegundoplano(background):enestesegundocaso,elindicadorreaparece
inmediatamente, locual nos permiteejecutarotrasordenes aunquelaquese lanz en segundoplanonohayaterminado. Paraejecutarunaordenensegundoplanoslodebemosfinalizarlalneadeordenescon &. SupongamosquedeseamosrealizarlacompilacindeunprogramaescritoenCyquelamisma duraalgunosminutos,siqueremosseguirtrabajandomientraselsistemarealizaeltrabajo,podemos ejecutarlaensegundoplano:
$gccmiprograma.c&#compilacinlanzadadefondo [1]1305 10%ls#seguimosmientrasotroprocesorealizalacompilacin
[2]1403
echo<mensaje>
Nohayrestriccinquelimiteelnmeroderdenesqueaparecenantesdel||,perosloseevala elestadodelaltima.
2.4.3. rdenesparaelcontroldetrabajos
Sedenominatrabajo,ojob,acadaordenquemandamosaejecutaralshell.Elshellmantienela pistadetodoslostrabajosquenohanfinalizadoysuministramecanismosparamanipularlos.En estaseccin,vamosaveresosmecanismosquenossuministraelshellparacontrolarlaejecucinde nuestrostrabajos.
26
jobs Untrabajopuedeestarenunodelostresestadossiguientes:primerplano,segundoplano,o suspendido (suspended o stopped, segn el sistema.). La orden jobs muestra los trabajos actualmenteasociadosconlasesindelShell(lanzadosenunterminal).Susintaxises:
jobs[l]
[1]+Stopped(user)xterm [2]Runningxclock
Sideseamosponerenprimerplanoxterm,dadoqueestasuspendido,podemosejecutar
$fg%1 xterm
Ahora,elshellnorespondehastaquefinalicemoselprocesoxtermolodevolvamosasegundo plano. Este tipode transferencia,nos permitelanzardefondoprogramas quenecesitenmucho procesamiento inicial tal como crear una base de datos y retomarlos cuando necesitemos interactuarconl. bg Contrariaalaordenfg,bgenvaasegundoplanounprograma:
bg[%job]
Ejecutaeltrabajoactual,oespecificado,enbackground.Estoseilustraenelejemplo.
54%jobs [1]+Stopped(user)xterm [2]Runningxclock 55%bg%1 [1]xterm&
Laorden% Laorden%seutilizaparacambiarelestadodeuntrabajo.
%[job][&]
28
kill Laordenkillenviaunasealaun(os)proceso(s).Tienedosformas:
kill[sig]{pid|%job}... killl
Laaccinpordefectodekillesenviarlasealdefinalizaralproceso(s)indicado(s)porPIDo nmerodejob.Lasseales, sig,seindicanpornmerosonombres.Conlaopcin l,listalos nombresdelasealesquepuedenserenviadas. LassealessonenLINUXelmediobsicoparanotificardelaocurrenciadeeventosalos procesos.Porejemplo,laspulsaciones<CTRL>C,<CTRL>Z,etc.loquehaceenrealidades provocarqueelmanejadordetecladogeneredeterminadassealesquesonenviadasalprocesoen ejecucin.Tambin,seenvansealescuandounprogramareferenciaunadireccininvlida(p.e. unpunteronoinicializado)delproceso.Enestecaso,segeneralaseal SIGSEGV,queproduceel mensajedesobraconocido"Segmentationfault:coredump".
2.5. Metacaracteresdeentrada/salidaodedireccin
Losmetacaracteresdeentradas/salidassonotradelascaractersticasdistintivasdeLINUX.Con ellos,podemosredireccionar(tomar)laentradadeunaordendesdeunarchivoenlugardelteclado, redireccionar (llevar) la salida estndar a un archivo en lugar de a la pantalla, o encauzar su entrada/salidaa/desdeotraorden.Tambin,podremosmezclarlosflujosdeinformacindelasalida yelerrorestndaresparaquesalganjuntosporlasalidaestndar.TenemosunresumenenlaTabla 2.2. Metacarcter <nombre >nombre 2>nombre Descripcindelafuncin Redirecciona la entrada de una orden para leer del archivo nombre. Redireccionalasalidadeunaordenparaescribirenelarchivo nombre.Sinombreexiste,losobreescribe. Redireccionaelerror(stderr)aunfichero.Sinombreexiste,lo
29
Descripcindelafuncin
Lasalidade stderr secombinacon stdout,yseescribenen nombre. Lasalidadelaordenseaadealfinaldelarchivonombre. Lasalidadestderrseaadealfinaldelarchivonombre Aadelasalidadestderr,combinadaconstdoutylasaadeal finaldenombre. Creauncauceentredosrdenes.Lasalidaestndardelaorden alaizquierdadesmboloseconectaalaentradaestndardela ordendeladerechadelsigno. Creauncauceentredosordenes,conlassalidasde stderr y stdout delaordendelaizquierdacombinadasyconectadas conlaentradadelaordendeladerecha.
Tabla2.2:Metacaracteresdeentrada/salidaodedireccin
|&
Redireccindelaentradaestndarcon< AlgunasordenesLINUXtomansuentradadearchivoscuyonombresepasacomoargumento, perosiestosnoseespecifican,comovimosanteriormente,lalecturasellevaacabode stdin.Otras rdenessloleendelaentradaestndar,porloquesiqueremosqueleandearchivodebemos utilizarlaredireccin<. Porejemplo,laordenmail(programabsicodecorreoelectrnico)leesuentradade stdinyno aceptaunnombredearchivocomoargumento(esperaqueescribamoselmensajeporteclado).Sin embargo,podemosescribirelmensajeenunarchivoypasrseloalaorden:
$cat>mimensaje HolaJuan:esteesunmensajedeprueba <CTRL>d $mailx333333<mimensaje $_
30
Como podemos observar, la orden cat >mimensaje indica al shell que el contenido de la entradaestndardebeserincluidoenelarchivomimensaje. Redireccindesalidacon>,2>y>& Lassalidasdelas rdenesvannormalmentea stdout,ymuchas rdenesescribenmensajesde erroroinformacinadicionalenstderr.Laredireccindelasalidapermiteenviarlassalidasaun archivo.Enestecasolosmensajesquesalenporstderrsiguensaliendoporpantalla.Siqueremos redireccionar el error a un fichero independiente utilizamos el metacarcter 2> y si queremos combinarenunmismoficherolastdoutystderr,utilizamoselmetacaracter>&. Losejemplosmuestranlosdiferentesmetacaracteresderedireccin.
$ls>temporal temporal $cattemporal archiv1 practicas proyecto $cattemporil#Suponemosquetemporilnoexiste cat:temporil:Noexisteelficherooeldirectorio $cattemporil>errores cat:temporil:Noexisteelficherooeldirectorio # El resultado de ls se almacena en
31
Redireccindeentradadentrodeprogramascon<< Elmetacarcter << nospermiteredireccionarlneasdesdeunprogramaalaentradadeuna orden dentro del programa. La redireccin se realiza mediante un mecanismo conocido como documentacinaqu.Estaredireccinpermiteescribirmensajesmultilneadesdeunprogramasin necesidaddeusarmltiplesrdenesecho. Parautilizarlo,escribimosacontinuacinde<<undelimitador,esdecir,unconjunto nicode caracteresquemarcarnelfindelaslneasdeentradaparaladocumentacinaqu.Cadaunadelas lneas deentradaquesevayaintroduciendoseexaminaparaigualareldelimitadorsinrealizar ningunasustitucin,oexpansindemetacaracteres.Unavezintroducidoeldelimitador,seejecuta laorden.Estonosvaapermitirajustardinmicamentelosmensajesuordenes. Elsiguienteejemplomuestracomousarestemecanismoparagenerarunmensajedebienvenida paraunusuarioadaptndoloasuentorno.Paraello,hacemosusodelasvariables$usery$PWD quenosdanellogindeusuarioyeldirectoriodetrabajoactual,respectivamente.
$cat<<FIN_BIENVENIDA Hola$user Sudirectorioactuales$PWD Noolvidemirarlasnoticias FIN_BIENVENIDA Holax3333333 Sudirectorioactuales/d5/home/x3333333 Noolvidemirarlasnoticias $_
32
Algomssobrecaucesyredirecciones Sideseamosmezclarlosmecanismosdecaucesyredireccionamiento,encontramosqueelnico lugardondelaredireccindearchivosseacomodadentrodeuncauceesalfinaldelaltimaorden delcauce.Enestecaso,podemosusarlaredireccindelasalidaparacapturarlasalidafinalenun archivo. Si intentsemos redireccionar la salida de una orden al principio o en medio de un encauzamiento,todos losdatos irn alarchivoynada fluir atravs del restodelcauce. Para permitirintroducirredireccionamientoencualquierordendeuncauce,existelaorden tee quea partirdeunflujodeentradadesdoblasteendos:unodeellospuedeirredireccionadoaunarchivo yelotroalcauce.Conlaredireccindestdinpasaalgosimilar,slopodemosusarlaenlaprimera ordendelcauce.Silausamosenmedio,seignoralainformacinquefluyeporelcauce.
tee<opciones><fichero>
Archivosdedispositivosyredirecciones En Linux, el directorio /dev contiene los archivos de dispositivos y pseudodispositivos (dispositivoslgicosquenosecorrespondenconundispositivohardware).Unodeestospseudo dispositivoses/dev/nullqueactacomounsumiderodeinformacin,deformaquetodoloquesele enva es descartado por el sistema y, por tanto, podemos enviarle la informacin que no necesitemos.Porejemplo,laorden time ejecutaotraordenpasadacomoargumentoynosdalos tiemposdeejecucindelamisma(modokernel,usuarioytiempodereloj).
$timels COORDINA.PSarchsurvey.pscomplete.wavwoods.ps real0m0.003s user0m0.001s sys0m0.002s
Comovemos,timemuestraelresultadodeejecutarlaordenlsyeltiempodeejecucin.Sino estamosinteresadosenelresultadodels,podemosdescartarlaenvindolaa/dev/null.Nota:como se puede observar los tiempos de ejecucin siguen vindose en pantalla aunque hemos redireccionadolasalidaestndar.Estosedebeaquelostiempossalenporelerrorestndar.
33
2.6. Empaquetadoycompresindearchivoscontarygzip
Comprimirunarchivo,agruparvariosenunosolooverqu contieneunarchivocomprimido sontareasqueutilizaremosfrecuentementeparahacercopiasdeseguridad,transportararchivosde unsitioaotro,etc.Aunqueexistenmultituddeprogramasdiferentesquenospermitenhaceresta clasedeoperaciones,generalmenteentodoslossistemasUNIXencontraremoslaherramienta tar. Esteprogramanospermitemanipulardecualquierformaunoovariosarchivosparacomprimirlos, agruparlos,etc. Aunqueconelmismo tar podemoscomprimirarchivos,laaplicacinens mismanoesde compresin.Comohemosdicho,paraelloutilizaprogramasexternoscomoelgzip. Compresindearchivos Lacompresindearchivosnospermiteahorrarespaciodediscoytiempoenlatransmisinde losmismos. Paracomprimirydescomprimirarchivospodemosutilizarlas rdenescuyasintaxisaparecea continuacin:
gzip[opciones][Ssufijo][nombre...] gunzip[opciones][Ssufijo][nombre...] bzip2[opciones][Ssufijo][nombre...] bunzip2[opciones][Ssufijo][nombre...]
gzip y bzip2 comprimen uno o varios archivos. Cada archivo es sustituido por uno cuya extensin es .gz o .bz, respectivamente. Los archivos son restaurados con las ordenes gzip d,
34
gunzip,bzip2d,bunzip2, Veamosalgunosejemplos.
$gziparchivo1archivos.gz $bzip2archivo2archivos2.bz
Podemosdescomprimirlosarchivosenlasalidaestndarenlasdosformassiguientes:
$gunziparchivos.gz $bzip2darchivos2.bz
Por ltimo,indicarquesiqueremoscrearun nicoarchivoconmltiplescomponentes que puedanextraerseposteriormentedeformaindependiente,esrecomendableutilizar tar,pues gzip estapensadoparacomplementaratar,noparasustituirlo. Empaquetadodearchivos Laordentarseutilizaparaempaquetarungrupodearchivosenun nicoarchivo,quetienela estructuradeunencabezadode512bytesyelarchivo,tantasvecescomoarchivosempaquetemos. Seutilizaparaalmacenarjerarquasdedirectorios,tenercopiasdeseguridadyahorrarespacio.Es laformahabitualdesuministrarparchesydistribucionesdesistemas. Lasintaxisdelaordentares:
tar[opciones][archivos]
Vamosaverunejemplodeempaquetadoenunarchivodediscodeunajerarquadedirectorios (todoslosarchivosdirectoriosquehayeneldirectorioMisPracticasSOI):
$cdMisPracticasSOI $tarcvfpracticasSoi.tar. ./Sesion1/archivo1 ... ./Sesion4/achivon $filepracticasSoi.tar practicasSoi.tar:GNUtararchive
Para restaurar posteriormente en el directorio actual todos los archivos podemos utilizar la opcinx:
$tarxvfpracticasSoi.tar
Observamoscomoelarchivotarnodesaparecealfinalizareltrabajo,puesnossirvecomocopia deseguridad.Conlasopcionesxyttambinpodemosrecuperararchivosconcretos:conlaprimera debemos conocer el camino de acceso al archivo, con la segunda no. Por ejemplo, podemos recuperarunaprcticaconcretadelaforma:
$tarxvfpracticasSoi.tarSesion2/ejercicio1.tcsh
Lasextensionesdelosarchivossontgzytbz,respectivamente.Amododeejemplo:
$tarcvzfmisPracticas.tgzmispracticas
36
37
2.7.- Ejercicios
2.7. Ejercicios
1.Desplzatehastaeldirectorio/binygeneralossiguienteslistadosdearchivos(siemprede laformamscompactayutilizandolosmetacaracteresapropiados): a) Todoslosarchivosquetengancomoterceraletradesunombreunaa b) Todoslosarchivosquenocomiencenporunaconsonante c) Todoslosarchivosquequecontenganunnmeroporda,df d) Todoslosarchivosquecomiencenporbyacabenenunnmero 2.Construyelasiguienteestructuradedirectorios Mail Inbox SPAM Sent 2006 SO EDI ylossiguientesficherosdetextoconcontenidodetuinvencin.
Situadoeneldirectorio SPAM Nombredelfichero banco.eml compraTelefono.txt Mail SO EDI IA LOCAL 2006 notas.eml noticiasPracticas.eml febrero2007_notas.eml anotaciones.txt listaAprobados.txt telefonosClase.eml
Local IA
38
2.7.- Ejercicios
SitundoteeneldirectorioMail: a) Utilizalaordenfindparaencontrartodoslosficherosqueacabenen.txt b) Utilizalaorden find paraencontrartodoslosficheroscuyonombrecontengala cadenafono c) Utilizalaorden find paraencontrartodoslosficheroscuyonombrecontengala cadenanot d) Utilizalaorden find ysuopcinexecparamostrarelcontenidodelosficheros cuyonombrecontengalacadenaeml. 3.Creaunalneade rdenesqueaadaelcontenidodetodoslosarchivoscontenidosen cualquier subdirectorio de Mail a un fichero llamado copiaSeguridad.bak situado en el directorioLocal 4.Construyeunalneaderdenesquedcomoresultadoelnmerodearchivosydirectorios quehayeneldirectoriodetrabajoy,acontinuacin,imprimalafechayhoraactual.Paraello necesitarsutilizarlasrdeneswc(cuentaelnmerodelneas,palabrasycaracteres)ydate (imprimelahoraylafechaactual). 5.Construya un archivo llamado agenda.txt en el directorio INBOX y configure sus privilegiosdeacceso,detalmodo,queelusuariopuedaleeryescribir,elgrupopuedaleery losotrosnopuedanhacernada. 6.Sin utilizar un editor de texto grfico, crea, en el directorio SO, un fichero llamado notas.txtcon10lneas,cadaunadelascualestengaesteformato: NombreDNICalificacin 7.Visualicelaprimeraylassieteltimaslneasdelarchivonotas.txt
39
2.7.- Ejercicios
8.Creaunalneaderdenesparaeliminartodaslaslneasduplicadas,menosuna,delarchivo telefonosClase.eml 9.Escribeunalneaderdenesparavisualizarlaslneasdelarchivo notas.txtquecontengan alumnosconlacadenazapensunombre 10.Busca archivos cuyo nombre contenga la cadena 86 a partir del directorio raz /. Redireccionalasalidayelerrordeformaadecuadaparaenterartedelasalida. 11.Creaunfichero.tgzyotro.tbzconlajerarquadedirectoriosdeMail. 12.Escribelaslneasderdenesquellevenacabolastareassiguientes: a) Contarelnmerodecaracteresylneasquehayenelarchivo notas.txtymostrarelresultado porpantalla(nohayquemostrarelnombredelarchivo) b) Contarelnmerodepalabrasylneasquehayenelresultadodelaorden ls1ymostrarel resultadoporpantalla c) Los mismo que el apartado (b), pero redirigiendo la salida a un archivo llamado estadsticas.data1 13.ConstruyeunatablaASCIIenelarchivoasiapac.temps,poniendoencadalnealosdatos deunaciudadporelordensiguiente:nombredelaciudad,temperaturamximaytemperatura mnima.Lalneasiguienteesunejemplo: Tokyo2810 Lainformacindelasciudadeseslasiguiente:(Kuala,28,13)(Karechi,30,12)(Tokyo,28, 10)(Lahore,20,11)(Manila,28,17)(NuevaDelhi,25,15),(Jakarta,3011),(Pekin,9,3)y (HongKong9,1) Escribelardenesnecesariaspararealizarlasoperacionessiguientes
40
2.7.- Ejercicios
a) OrdenarlatablapornombresdeciudadesyguardarlaenelficheroordenNombre.txt b) OrdenarlatablaportemperaturasmnimasyguardarlaenelficheroordenMaxima.txt c) Ordenarlatablaempleandolatemperaturamximacomoclaveprimariaylatemperatura mnimacomoclavesecundariayaadirlaalficheroordenNombre.txt 14.Creaunordenquemuestreporpantallatodoslosarchivosocultosquehayentudirectorio home. 15.Creaunaordenquemuestreporpantallaelnombredecincoeditoresdetextoquehayaen elsistema. 16.Iniciaunprogramainteractivo(porejemplo,xclock),ysuspndalo.Revisalalistade procesosycompruebaqueelnuevoprocesoest yquesuestadoseasuspendido.Despus reincialoensegundoplanoyfinalmenteelimnalo. 17.Queharelcomandotouch*.c?
41
3. COMANDOSSHELLII
3.1. Historiaderdenes
Lasrdenesqueseescribenenelterminalsevanguardandoenunarchivohistrico,esloquese llamahistoriaderdenes.stavaalmacenandolasrdenesconsusrespectivosparmetrosquesele vandandoalashellparaqueejecute.Elsentidodemantenerlahistoriaesfacilitaryhacerms rpidalarepeticindealgunaordenqueyahabamosejecutadoypoderreutilizarsusargumentos. Enesteapartado,vamosaestudiarcomoconseguirqueelshellmantengaunahistoriadelas rdenesdadas,ycmovolverallamarardenesdadasconanterioridad,modificarlasyreutilizarlas. Asignandolavariablehistoria Lavariable$HISTSIZEcontieneelnmerode rdenesquesevanaalmacenarenlahistoria antesdedescartarlaordenmsantiguaalmacenada.Elvalorpredeterminadoparaestavariablees de500,sibienpodemoscambiarloasignndoleotrovaloralavariable. Paraconsultarelvalordelasvariablesdeberemosteclearset.
$bash$ set argv() PWD/tmp/ HISTSIZE500 USER SHELL mluque /bin/bash
42
precedidadeunnmeroqueindicalaocurrenciadelamismaenlahistoria,empezandopor1para laordenmsantigua.Ennuestrocaso
$bash$ history 1echo$SHELL 2ls 3psax 4find.name*.txt 5history history[opciones] N:mostrarnicamentelasNltimaslneasdelhistrico c:borrarlalistahistrica Pruebaelcomandohistory.Quocurresilolanzasendiferentes terminales
Almacenandolahistoriaderdenes Cuandoabandonamosunashell(bienutilizandoelcomando exit ocerrandoelterminal),las rdenesquesehayanejecutado(listadohistrico)seguardanenelarchivohistrico.Larutadeeste archivoseencuentraalmacenadaenlavariable$HISTFILE;elarchivohistricopredeterminado sueleser~/.bash_history. Repitiendordenesconeleditorderdenes Enelbash,podemosutilizaruneditorde rdenespararecuperaryejecutar rdenes.Conlas flechasarribayabajodelteclado,podemosmovernoshaciaadelanteyhaciaatrsenlahistoriade rdenes.Cadaordenvaapareciendoenpantallasegnlarecuperemosconelcursorsituadoalfinal. Podemospulsar<RETURN>paraejecutarla<CONTROL>Cparacancelarla.Tambin,podemos editarlasrdenesparareciclarlas.Utilizandolasflechasizquierdayderechapodemosmovernospor lalnea(ordenrecuperada)yborraroinsertarparamodificar,segnnuestranecesidad,laorden recuperada.
43
44
Significado
ElintervalodepalabrasdesdeelnmeroN1alN2 23Laspalabrasoylab1
Tabla3.1:Indicadoresdepalabra
Los modificadores cambian la forma en la que el evento actual es tratado. Algunos de los modificadoresmstilesaparecenenlaTabla3.2(elrestopuedenconsultarseenelmanualenlnea sobrehistory). Modificador p r e h t Descripcin Imprimeelresultadodeunaordensinejecutarla Eliminalarazdelnombredearchivo Eliminalaextensindelnombredearchivo(partequesigue alpunto) Sequedaconlacabeceradelaruta(todomenosel ltimo componente) Sequedaconelfinaldelaruta(ltimocomponente)
Tabla3.2:Modificadoresdelareferenciasdelahistoria 45
3.2. Autocompletarconeltabulador
UnateclamuyconocidaenBasheseltabulador,quenosayudaaterminarderellenarunaorden conelnombredeuncomando,deunavariable,deunficheroodirectorio,oconelnombredeuna funcinBash.Paraello,sesiguenlassiguientesreglascuandosepulsaeltabulador: 1. Sinohaynadaqueempieceporeltextodelapalabraqueprecedealcursorseproduceun pitidoqueinformadelproblema. 2. Sihayuncomando(enelPATH),unavariable(siempreprecedidapor$),unnombrede ficheroofuncinBashquecomienzaporeltextoescrito,Bashcompletalapalabra. 3. Sihayundirectorioquecomienzaporelnombreescrito,Bashcompletaelnombrede directorioseguidoporunabarradeseparacindenombresdedirectorios,/. 4. Sihaymsdeunaformadecompletarlapalabra,elshellcompletalomsquepuedey emiteunpitidoinformandodequenolapudoterminardecompletar. 5. CuandoBashnopuedecompletarunacadena(porhabervariasposiblesqueempiezan igual),podemospulsardosveceseltabuladorysenosmostrar unalistaconlasposibles cadenas.
3.3. Metacaracteres
Todoslosshellsposeenungrupodecaracteresqueendiferentescontextostienendiferentes significados,losmetacaracteres.stosjueganunpapelimportantecuandoelshellestanalizando lalneaderdenes,antesdeejecutarla.Vamosaverlosagrupadossegnlafuncinquerealizan.
46
3.3.- Metacaracteres
3.3.1. Metacaracteressintcticos
SirvenparacombinarvariasrdenesdeLINUXyconstruirunanicaordenlgica.Suministran una forma de ejecucin condicional basada en el resultado de la orden anterior. La Tabla 3.3 muestraestoscaracteresydaunadescripcindesufuncin(verprctica1XXXXX). Metacarcter ; | Descripcindelafuncin Separadorentrerdenesqueseejecutansecuencialmente Separacin entre rdenes que forman parte de un cauce (pipeline).Lasalidadelaordendelaizquierdadelseparador eslaentradadelaordendeladerechadelseparador. Seusanparaaislar rdenesseparadaspor; |.Las rdenes dentro de los parntesis, ejecutadas en su propio shell, son tratadas como una nica orden. Incluir un cauce dentro de parntesis,nospermiteasuvezincluirloenotroscauces. Indicadordetrabajoensegundoplano(background).Indicaal shellquedebeejecutareltrabajoensegundoplano. Separadorentrerdenes,dondelaordenquesigueal||slose ejecutasilaordenprecedentefalla. Separadorentrerdenes,enlaquelaordenquesigueal&&se ejecutaslosilaordenprecedentetienexito.
Tabla3.3:Metacaracteressintcticos
()
& || &&
3.3.2. Metacaracteresdenombredearchivos
stosseutilizanparaformarpatronesdeigualacinparalasustitucindenombresdearchivos conelfindepoderreferenciardeformaabreviadaunaseriedearchivoscuyosnombressiguenun patrn.LaTabla 3.4 muestraestosmetacaracteres.Paraverunadescripcinmsdetalladaverla prcticaXXXX. Metacarcter ? * [] Descripcindelafuncin Comodnacualquiercarctersimple Igualacualquiersecuenciadeceroomscaracteres Designauncarcterorangodecaracteresque,comounaclase,son
47
3.3.- Metacaracteres
Metacarcter
{} ~
Abreviarconjuntosdepalabrasquecompartenpartescomunes Seusaparaabreviarelcaminoabsoluto(path)deldirectoriohome
Tabla3.4:Metacaracteresdenombredearchivos
3.3.3. Metacaracteresdecitacin
Losmetacaracteresdecitacin,Tabla3.5,seutilizanparacontrolarcundodebenprotegerseel resto de metacaracteresdelaexpansin ointerpretacin delshell. Denominamos expansin al procedimientoporelcualelshellsustituyelaocurrenciadeuncarcterespecialporunalista. Metacarcter \ ' ` Descripcindelafuncin Evita que el carcter que le sigue sea interpretado como un metacarcterporelshell. Evitaquelacadenadecaracteresencerradaentredoblescomillas seainterpretadacomometacaracteres. Evita que la cadena de caracteres encerrada entre comillas simplesseainterpretadacomordenesometacaracteres. La cadena de caracteres encerrada entre acentos se interpreta comounaordenyseejecuta
Tabla3.5:Metacaracteresdecitacin
Eludirmetacaracterescon\ Cuandoelshellprocesaunaorden,loprimeroquehaceessustituirlosmetacaracteresporsus respectivosvaloresparaqueenlaejecucinaparezcanlosvaloresreales,nolosmetacaracteres. "Eludir" metacaracteres significa evitar su interpretacin por el shell, de forma que stos permanezcanenlalneaderdenesparaserprocesadosenlaejecucin.
48
3.3.- Metacaracteres
Supongamosquequeremoscrearunosarchivosconnombres abc;1 y TrabajoParaCasa.Si escribisemos estos nombres como tal, el shell interpretar el ; y el espacio en blanco como separadores,respectivamente(prubaloparaverquedice). Paraevitarlopodemosescribir:
$bash$mvabc1abc\;1 $bash$mvTrabajoParaCasaTrabajo\Para\Casa
Protegiendometacaracterescon Labarrainvertidasloprotegealcarcterquelasigueinmediatamente,porloquenoescmodo para proteger cadenaslargas. En estos casos, podemosprotegerla cadenacompletausando las comillasdobles.stasdesactivanelsignificadoespecialdeloscaracteresentreellas,salvolosde ! evento,$vary`cmd`querepresentanlasustitucindelahistoria,variablesyejecucinderdenes, respectivamente.Ejemplo:
$bash$ echo"****Hola$USER" ****HolaPepito $bash$
3.3.- Metacaracteres
3.3.4. Metacaracteresdeentrada/salidaodedireccin
Losmetacaracteresdeentrada/salidasonotradelascaractersticasdistintivasdeLINUX.Con ellos,podemosredireccionar(tomar)laentradadeunaordendesdeunarchivoenlugardelteclado, redireccionar (llevar) la salida estndar a un archivo en lugar de a la pantalla, o encauzar su entrada/salidaa/desdeotraorden.Tambin,podemosmezclarlosflujosdeinformacindelasalida yelerrorestndaresparaquesalganjuntosporlasalidaestndar.VemosunresumenenlaTabla 3.6. Metacarcter <nombre >nombre &>nombre 2>nombre >>nombre &>>nombre | Descripcindelafuncin Redirecciona la entrada de una orden para leer del archivo nombre. Redireccionalasalidadeunaordenparaescribirenelarchivo nombre.Sinombreexiste,losobreescribe. Lasalidade stderr secombinacon stdout,yseescribenen nombre. Lasalidadestderrseescribeennombre Lasalidadelaordenseaadealfinaldelarchivonombre. Aadelasalidade stderr,combinadacon stdout alfinalde nombre. Creauncauceentredosrdenes.Lasalidaestndardelaorden alaizquierdadesmboloseconectaalaentradaestndardela ordendeladerechadelsigno.
Tabla3.6:Metacaracteresdeentrada/salidaodedireccin
3.3.5. Metacaracteresdeexpansin/sustitucin
Losmetacaracteresdeexpansin/sustitucinactancomoindicadoresespecialesparaelBash. LaTabla3.7muestraloscuatrometacaracteresdeestetipo.
50
3.3.- Metacaracteres
Metacarcter $ ! :
Estosmodificadoresnoshanidoapareciendoalolargodelosguiones,veamosquesignifican: "$" sirveparaindicaralshellquesustituyaunavariableporsuvalor; "!" eselindicadordela historiade rdenes;ylos ":" separanlaordendelosdesignadoresdepalabraenlahistoriade rdenes.
3.4. Losalias
3.4.1. Definicinyeliminacindealias
Unaliasesunnombremscorto(seudnimo)parauncomandoqueusamosmuyamenudo.El mecanismodealiaspermiteadaptarelcomportamientodelasrdenesLINUXcuandoseejecutan. Essimilaralacapacidaddedefinicindemacrosenotroslenguajes.EnBash,laorden alias,se encargadecrearunseudnimoparaunaorden.
alias[nombre_alias]=[definicin_orden]
Asociaunnombre_aliasconladefinicin_orden.
$bash$ aliasdir=lsl#asignaalslelnombrededir
Cuandoveamosqueyanonosestilladefinicindeunalias,podemosborrarlasinsalirdel sistema.Lasintaxises
unaliasnombre_alias
dondenombre_aliaseselnombredelaliasquesevaaborrar.
51
3.4.2. Listarladefinicindelosaliasexistentes
En nuestro entorno de prcticas, el sistema define algunos alias de uso comn. Se pueden parecerbastantea:
$bash$ alias #listalosaliasexistentesysudefinicin l.lsd.[azAz]*color=tty lllslcolor=tty lslscolor=tty whichalias|/usr/bin/whichttyonlyreadaliasshowdo $bash$ alias ll#muestraladefinicindelaliasll lllslcolor=tt
3.4.3. Renombraroredefinirunaordenexistente.
Esto permite ahorrar escritura de rdenes o que nuestro sistema se parezca a otro sistema operativo.
$bash$ aliasrename=mv#renombramvalnombrerename $bash$ aliasls='lsl'#abrevialaescrituradelsl
3.4.4. Crearunanuevaorden
Permiteabreviarlaescrituradelasrdenesqueusamosfrecuentemente:
$bash$ aliashp='history|more'#hpmuestrahistoriapaginada $bash$ aliasht='history|tail'#htmuestraelfinaldelarchivo dehistoria
52
Precauciones! 1. Aveces,losaliaspuedenentrarenconflictoconprogramasdelshell,especialmentesise usanparalaredefinicinde rdenes.Unprogramashellpodranofuncionarcorrectamente porqueesperaelcomportamientopordefectodeunaorden. 2. Definesiemprelosaliasmultipalabraentrecomillassimples. 3. Alcrearunalias,debemostenerlaprecaucindenollamarlos alias,nicrearaliasquese referencienaellosmismosparanocrearunbucleenlasdefinicionesdestos.Ahorabien,s podemoscrearaliasquereferencienaotrosalias. 4. Cuandodefinimosunalias, stesloestar disponibleenelterminalenelquesecre y, adems,cuandoseapagueelordenadorseperder.Siqueremosqueunaliasestdisponible ennuestrosistemasiemprequearranquemos,podemosdefinirlodentrodelfichero~/.bashrc. EsteficheroseejecutasiemprequesearrancaBash.
3.5. Variables
Elshell,comolenguajedeprogramacinquees,necesitapoderdefiniryusarvariables.Una variableesunaposicindelamemoriaprincipalalacualseleasignaunnombre.Estonospermite aludir a esta posicin dememoriaempleandounnombre,en lugarde utilizarsu direccin. El nombredeunavariabledeshellpuedeestarformadopordgitos,letrasyelguininferior(_), siempreycuandoelprimercarcterseraunaletraounguininferior.Lamaysculasyminsculas seconsiderandistintasylalongituddelnombrenoestlimitada.Comolamemoriaprincipalesun tipodealmacenamientoqueadmitelecturayescritura,sepuedeleerelvalordelavariable,y tambinselepuedeasignarunnuevovalor.ParalashelldeBash,lasvariablessonsiemprecadenas decaracteres,aunquesealmacenennmerosenellas.
3.5.1. Variablesdeentornoyvariableslocales
Lasvariablesdelshellpuedenperteneceradostipos:variablesdeentornoyvariablesdefinidas porelusuario.Lasdospuedenalbergarvalores,cadenasonmeros,ypuedenutilizarsetantoen programasshellcomointeractivamente.Ladiferenciaentreambasradicaensualcanceombito.
53
3.5.- Variables
Lasvariablesdeentornosirvenparapersonalizarelentornoenelqueseejecutalashellypara ejecutarcorrectamentelas rdenesdelshell.Cuandodamosalshellunaordeninteractiva,Linux inicia un nuevo proceso para ejecutar la orden. El nuevo proceso hereda algunos atributos del entornoenelquesecre.Estosatributossepasandeunosprocesosaotrospormediodelas variablesdeentorno,tambindenominadasvariablesglobales($HOME,$SHELL,$USER,...). Porcontra,las variablesdefinidasporelusuarioolocales nosepasandeunosprocesosa otrosysuscontenidossedescartancuandosalimosdelshellenelcualsedefinieron. Elshelltrataporigualatodaslasvariables:lasidentificaporunprefijoespecial,el signodolar ($),queindicaquelapalabraquesigueeselnombredeunavariable.Porotraparte,existeuna convencin para la designacin de variables: se usan letras maysculas para las variables de entorno,yminsculasparalasvariableslocales.ComoLinuxessensiblealtipo,esimportanteel usodemaysculasominsculas.Nosonlomismo$COSA,que$cosa,que$CoSa,etc. Para visualizar los valores de todas las variables del sistema se utiliza el comando set sin argumentos.
3.5.2. Creacindevariables
Siqueremosdarlevaloraunavariable
var=Valor var= #asignaValoralavariablevar #asignaunvalornuloalavariablevar
Dondevareselnombredelavariable,compuestoporletras,dgitosy/osubrayado(_).Si varno existe,secrea,ysino,secambiaelvalordelavariable. Nopuedenexistirespaciosanteso despusdelsmbolo=. Sin el argumento valor, ala variable se le asigna unvalor nulo.Siel argumentoes valor, entoncesseasignavaloravar.Elvalorpuedeserunapalabrao(lista_de_palabras). Lasvariablesmultipalabrasonmatricescuyoselementospuedenseraccesiblesindividualmente, indicandosuposicindentrodelamatrizcon[](comenzandoconelelementonmero0).
54
3.5.- Variables
$bash$ varprueba=prueba123 $bash$ matrizpru=(prueba123) $bash$ varvacia $bash$ matrizpru[3]=dos $bash$ nombre='FernandoLpez' $bash$ nombre2=Fernando\Lpez
Paraobtenerelvalordeunavariabledebemosdeprecederlapor$yutilizarlaordenecho.La ordenechosirve,adems,paramostrarunalneadetextoporpantalla.
echo$variable echofrase
$bash$ echo$var pr ueba prueba123 $bash$ echo$no mb re2 FernandoLpez $bash$ echo${m at rizpr u[0]} prueba $bash$ echo${m at rizpr u[3]} 3 $bash$ echoEs toesuna f rase Estoesunafrase $bash$ echo Eldir ect oriocon tiene `ls |w c l`f icher os Eldirectoriocontiene12ficheros.
55
3.5.- Variables
$unsetNOMBRE
3.5.3. Personalizarelprompt
Elprompteselindicadordequelalneadecomandosestlibreparaaceptarunanuevaorden. Enlasaulasdeprcticas,el prompt pordefectoes $bash$,sinembargopodemospersonalizarlo paraquepongaloquenosotrosqueramos. LacadenaquesemuestraenelpromptsealmacenaenlavariabledeentornoPS1,porlotanto, bastarconcambiarelvalordeesavariable,paracambiarelpromptdenuestrosistema. LaTabla3.8muestraalgunasopcionesquepodemosusarparapersonalizarelprompt,veamos algunasdeellas. Opcin \A \d \H \h \j \n \r \s \t \T \u \v \w \W \# Descripcin LahoraenformatoHH:MM Lafechaenformatosemanamesdia Hostname Elnombredelamquinahastaelprimerpunto Nmerodejobshijosdelshell Retornodecarroynuevalnea Retornodecarro Nombredelshell HoraenformatoHH:MM:SScon12horas Horaenelformatoanteriorperocon24horas Nombredeusuario VersindeBash Rutadeldirectorioactual Nombredeldirectorioactual(sinruta) Nmerodecomandosejecutado
56
3.5.- Variables
Opcin
Descripcin
\$ \nnn \\
57
3.5.- Variables
PS3yPS4sonpromptsdeprogramacinydepuracin.
3.5.4. Variablesdeentornointernas
Existenunaseriedevariablesdeentorno,lascualesseresumenenlaTabla 3.9,quenolas fijamosnosotrossinoquelasfijaelshell,ycuyovaloresdeslolectura. Variable SHELL LINES COLUMNS HOME PWD OLDPWD Descripcin Pathdelintrpretederdenesqueestamosusando Lneasdelterminalencaracteres Columnasdelterminalencaracteres Directoriohomedelusuario Directorioactual Anteriordirectorioactua
58
3.5.- Variables
Variable USER
Descripcin Nombredeusuarioconelqueestamosconectados
Tabla3.9:Variablesdeentornointernas
3.5.5. Exportarvariables
Cuandodefinimosunavariable,esavariablenoesconocidaautomticamenteporlosprocesos hijosquelanzalasesinBash,anoserqueestasepongaexplcitamenteasudisposicin,conel comandoexport. Porejemplo:
$bash$ EDITOR=/sw/bin/joe $bash$ exportEDITOR
3.6. Scripts
EnelCaptulo1(XXX)comentamosquelosintrpretesde rdenesoshellseranlenguajesde programacinyquenuestroobjetivoseraaprenderestelenguaje,enconcreto,elcorrespondienteal Bash.Bien,comencemosaconocerestelenguaje. CuandoprogramamosenC,creamosunficheroconextensin.cdondeescribimoselcdigodel programayacontinuacinlocompilamosparaobtenerelprogramaejecutable.Deigualforma,en Bash,laformamscomndeejecutarprogramasescrearficheros(enestecasoconextensin.sh) quesellamanarchivosinterpretadososcriptsyquecontienenunacoleccinderdenesBashque sernejecutadasporlashell.
59
3.6.- Scripts
Paraimplementarestemecanismo,losdiseadoresdeLINUXsobrecargaronlafuncionalidadde lallamadaalsistemaquepermiteejecutarunprograma,lallamada exec.Deestaforma,cuando mandamosaejecutarunprograma,lafuncinexeccompruebasielarchivoesbinarioono.Siesun binario,resultadodeunacompilacin,loejecutaenlaformausual.Perosielarchivonoesbinario, lafuncin exec est diseadaparasuponerqueloquecontieneelarchivoson rdenesparaun intrpretede rdenes,porloqueejecutaunshellylepasaelcontenidodelarchivoparaquelo interprete.Deaqu elnombredearchivosinterpretados.Ahorabien,elshellcreadopor exec por defectoesunBourneshell(bash)Qu ocurresiqueremosejecutarunprogramaescritoenotro lenguajeshell? Enestecasoseutilizaelsiguienteconvenio:laprimeralneadelarchivointerpretadodebe contener el programa intrprete al que se le debe pasar el resto del contenido del archivo. El convenioparaindicarelintrpretees:
#!path_absoluto_del_interprete[argumentos] #!/bin/bash
3.6.1. Primerospasosconscripts
Paracrearun script usamoscualquiereditordetextoyloguardamosenunfichero.Unavez creadoelscriptexistendosformasdeejecutarlo: 1. Laprimeraformaimplicadaralficheropermisodeejecucin(conelcomandochmod). Unavezdadoestepermiso,podremosejecutarlosimplementeponiendo./script.Dehecho, muchoscomandoscomunes(p.e.spelloman)estnimplementadoscomoscriptsBashyno comoprogramasCejecutables.
./<ficheroscript>
2. Lasegundaconsisteenejecutarloconelcomandosource,elcualcargaelficheroenla
60
3.6.- Scripts
memoriadeBashyloejecuta.
source<ficheroscript>
Unadiferenciaentreestasdosformasdeejecutarunscriptesquesiloejecutamosconsource, ste se ejecuta dentro del proceso del shell, mientras que si lo ejecutamos como un fichero ejecutableseejecutaenunsubshell.Estoimplicaqueslolasvariablesdeentornoexportadasson conocidasporelnuevosubshellqueejecutaelprograma;yquelasvariablesqueseancreadasenla ejecucindelprogramaseconocernasufinalizacin. Nuestroprimer script :Holamundo Paracrearunscriptbastaconabrirunficheroconcualquiereditordetexto(nedit,pico,vi,gedit) y,acontinuacin,indicarlasaccionesquequeramosquerealicenuestroscript.
#!/bin/bash echoHolaMundo
Estescript(hello.sh)tieneslodoslneas.Laprimeraleindicaalsistemaqu programausar paraejecutarelfichero;ylasegundaeslanicaaccinrealizadaporestescript,queimprime'Hola mundo'enlaterminal. Sisalealgocomo ./hello.sh:Comandodesconocido,probablementela primera lnea, '#!/bin/bash', est mal escrita. Ejecutad whereis bash para saber donde se encuentraelcomandobashyaseguraosdequelasbarrassonlasadecuadasyquenohabis dejadoespacios. Un script decopiadeseguridadmuysimple Elsiguientescript(copiaSegurida.sh),creaunacopiadeseguridaddeldirectoriohome.
#!/bin/bash tarxvf/var/copia.tar/home/in1lurom gunzip/var/copia.tar
Estescript,envezdeimprimirunmensajeenlaterminal,empaquetaycomprimeeldirectorio homedelusuario.
61
3.6.- Scripts
sloimprime"Holatodos".
#cat/etc/passwd
noejecutanada,pueselsmbolo#conviertetodalalneaencomentario. Losscriptssuelenencabezarse(despusdelalnea#!/bin/bash)concomentariosqueindicanel nombre del archivo y lo que hace el script. Tambin se suelen colocar comentarios de documentacin en diferentes partes del script para mejorar la comprensin y facilitar el mantenimiento.Uncasoespecialeselusode#enlaprimeralneaparaindicarelintrpreteconque seejecutarelscript.Unscriptconcomentariosquedaraas:
#!/bin/bash #misdatos.sh# #muestradatospropiosdelusuarioqueloinvoca # echoMISDATOS. echoNombre:$LOGNAME echoDirectorio:$HOME echonFecha: date#muestrafechayhora echo#lneaenblancoparapresentacin #finmisdatos.sh
3.6.2. Variableenlosscripts
IgualquecuandoprogramamosenC,dentrodelos scripts sepuedenutilizarvariablespara clarificarofacilitarlacompresindelprograma.Sinoseespecificaotracosa,lasvariablesBash
62
3.6.- Scripts
sondetipocadena,porloquepuedencontenerunnmero(representadocomounacadena),un carcter o una cadena de caracteres. Su creacin, consulta y borrado es igual a la vista en el apartado5;noesnecesariodeclararla,secrearsloconasignarleunvalorasureferencia.
#!/bin/bash #Ejemplo1devariables cad=HolaMundo echo$cad
El script anterior (variables.sh) crea una variable cad con el valor Hola mundo y a continuacinlamuestraporpantalla.
#!/bin/bash #Ejemplo2 nombre="FulanitodeCopas" echo"$nombre(asignadoentrecomillas)" echoSiloasignosincomillaspasaesto: nombre=FulanitodeCopas
Elscriptanteriordaracomoresultadolosiguiente
$bash$ ./ejem plo2 FulanitodeCopas(asignadoentrecomillas) Siloasignosincomillaspasaesto: ./demo04.variables:line7:de:commandnotfound
Alasignarunacadenaquecontieneespaciosaunavariable,sinutilizarcomillas,nosdaunerror. Otroejemploconvariables
#!/bin/bash #Ejemplo3:asignacindevariables echon"Asignosincomillasaunavariablelacadena demo*ylaescribo" nombre=demo* echo$nombre echonAsignoahoraconcomillaslamismacadenayescribo lavariable" nombre=demo*
63
3.6.- Scripts
echo$nombre
Porqu?
3.6.3. Pasodeargumentosalosscripts
Enocasiones,puedesertilquenuestrosscriptsrecibanalgntipodeargumento(undirectorio sobreelqueactuarountipodearchivoquebuscar)alserejecutados.Parahacerreferenciaaestos argumentos,dentrodelosscriptsseempleanunaseriedevariablesquesiempreestarndisponibles, los parmetrosposicionales $1,$2,$3,..., ,siendo $0 elnombredelpropioprograma.Reciben estenombreporqueselesreconoceporsuubicacin,esdecirelprimerargumentoes $1,elsegundo $2yassucesivamente. Porejemploimaginemosquecreamoselscriptsiguiente:
#!/bin/bash #Ejemplo4:scriptquerecibeparmetrosylosimprime echo"Elscript$0" echo"Recibelosargumentos$1$2"
64
3.6.- Scripts
Alejecutarloobtenemos:
$bash$ ./ejemplo5.shholaadios Elscript./ejemplo5.shrecibe2argumentos:holaadios
65
3.6.- Scripts
Elscript./ejemplo5.shrecibe2argumentos:holaadios
Aunque cuando no entrecomillamos $* o $@ no existen diferencias entre usar uno y otro, cuandolosencerramosentrecomillasdobles(),podemoscambiarelsmboloqueusa $* para separar los argumentos cuando los muestra por pantalla. Por defecto, cuando se imprimen los argumentos,estosseseparanporunespacio,peropodemosutilizarotroseparadorindicndoloenla variabledeentornoIFS(InternalFieldSeparator).Lavariable$@siempreusacomoseparadorun espacioynosepuedecambiar.Porejemplosihacemoselsiguientescript:
#!/bin/bash #Ejemplo7:scriptquerecibeparmetrosylosimprime IFS=',' echo"Elscript$0recibe$#argumentos:$*" echo"Elscript$0recibe$#argumentos:$@"
Alejecutarloobtenemos:
$bash$ ejemplo6holaadios Elscript./reciberecibe2argumentos:hola,adios Elscript./reciberecibe2argumentos:holaadios
Vemoscomo,enelcasode $*,losargumentosseseparanporelsmbolocoma(,)(separador establecidoenlavariableIFS),mientrasqueenelcasode$@sesiguenseparandoporespacios(no leafectaelvalordelavariableIFS). Siempre conviene entrecomillar las variables $* y $@ para evitar que los argumentos que contenganespaciosseanmalinterpretados. Expansindevariablesusandollaves Realmentelaformaqueusamosparaveraccederalcontenidodeunavariable, $variable,esuna simplificacindelaformamsgeneral${variable}.Lasimplificacinsepuedeusarsiemprequeno existanambigedades.Enesteapartadoveremoscuandoseproducenlasambigedadesquenos obliganausarlaforma${variable}. Laforma${variable}seusasiemprequelavariablevaseguidaporunaletra,dgitooguinbajo
66
3.6.- Scripts
Otro lugar donde necesitamos usar llaves es cuando vamos a sacar el dcimo parmetro posicional.Siusamos$10,Bashloexpandirpor$1seguidodeun0,mientrasquesiusamos${10} Bashnosdareldcimoparmetroposicional Tambinnecesitamosusarlasllavescuandoqueremosaccederaloselementosdeunavariable multipalabra.Porejemplo:
$bash$ matr iz=(uno dos tres) $bash$ echo $mat riz uno $bash$ echo $mat riz[ 2] uno[2] $bash$ echo ${matr iz[2]} tres
67
3.7.- Ejercicios
3.7. Ejercicios
1.Despusdeejecutarlassiguientesrdenes:i)lsii)dateiii)cat>pru.txtiv)wclpru.txt v)lslvi)chmod644pru.txtvii)echo$PATHviii)cd..ix)pwdx)echoHolamundo
2.Suponiendoellistadoderdenesdelejercicioanterioryutilizandoelsignobang(!):
3.Creaunalneaderdenesqueindiquemedianteunmensajesilaejecucindelaorden cat prueba.txttuvoxitoono.Laordendeberredirigirlasalidadeerrordeformaadecuada. 4.Muestra los siguientes mensajes en pantalla haciendo uso de la orden echo. (Las indicacionesennegritayentre<>indicaquehayqueejecutarunaordenparaobtenerese valor)
5.Creaunaliasllamadocomprimirqueempaqueteycomprimaundirectoriocualquiera.
68
3.7.- Ejercicios
6.CreaunaliasllamadobuscarCquebusquetodoslosarchivosconextensin.capartirde tudirectoriohome. 7. Crea una variable fecha cuyo contenido sea la fecha y hora actual. Comprueba su contenido. 8.Modificatupromptparaquemuestreelsiguienteaspectou(h):dr donde:
9.Creaunscriptdenombredatos.shqueejecutelassiguientestareas:
10.Ejecutaelscriptanterioryalmacenasusalidaenunficheroquesellameinformacion.txt 11.Creaunscript,denombrecopia.sh,querealice
Unacopiadelficherocreadoenelejercicioanterior(informacion.txt)enelfichero
informacionDuplicada.txt
informacion.txt
69
3.7.- Ejercicios
12.Realizaunscript,connombreinfoDir.sh,querecibacomoprimerparmetroelcamino completodeundirectorioymuestreporpantalla:a)Losficherosqueempiezanporunavocal yb)elnmerototaldeficherosydirectoriosquehayenesedirectorio. 13.Creaunscript,connombremueveFicherosTexto.sh,querecibacomoprimerparmetro el nombre de un directorio que no existe y como segundo parmetro el nombre de un directorioqueexiste.Elscriptdebercrearelprimerdirectorioymovertodoslosficherosque acaben en .txt del directorio pasadocomo segundo argumento al directorio pasadocomo primerargumento. 14.Crea un script, que se llame intercambiar.sh, que acepte dos argumentos. Los dos argumentossecorrespondernconlosnombresdedosarchivosexistentescuyoscontenidos sernintercambiadosalejecutarelscript.Porejemplo,sielarchivofich1contienelapalabra holayelarchivofich2contienelapalabraadis,alejecutarelscriptydarlecomoargumentos losnombresdeestosdosarchivos,elresultadoser que fich1 contendr lapalabraadisy fich2contendrlapalabrahola. 15.CreaunscriptllamadocopiaSeguridad.shquerecibacomoprimerparmetroelnombre de un directorio y como segundo parmetro el nombre de un fichero. El script deber empaquetarycomprimireldirectoriopasadocomoprimerparmetroenunarchivoconel nombredelsegundoparmetro. 16.CreaunscriptllamadocrearScript.shalcualselepasacomoargumentoelnombredel scriptacrear.CrearScript.hcrearotroscript,cuyonombreserelargumentorecibido,yuna vezcreado,ledar permisosdeejecucin.Elsegundoscriptrecibir comoargumentosel nombredeunficheroyelnombredeundirectorio;crear eldirectorioyhar unacopiadel ficheroeneldirectoriorecincreado.
70
4. PROGRAMACINBASHI
4.1. Variablescontipo
Hastaahoratodaslasvariablesquehemosusadosondetipocadenadecaracteres.Aunqueenlos primerosshellslasvariablesslopodancontenercadenasdecaracteres,despusseintrodujola posibilidaddeasignaratributosalasvariablesqueindiquen,porejemplo,quesonenterasodeslo lectura.Parafijarlosatributosdelasvariables,tenemoselcomandointernodeclare,elcualtienela siguientesintaxis:
declare[opciones][nombre[=valor]]
LaTabla 4.1 describelasopcionesquepuederecibirestecomando.Unapeculiaridaddeeste comandoesqueparaactivarunatributoseprecedelaopcinporunguin,conloquepara desactivarunatributodecidieronprecederlaopcinporun+. Opcin a f F i r x Descripcin Lavariableesdetipoarray Mostrarelnombreeimplementacindelasfunciones Mostrarsloelnombredelasfunciones Lavariableesdetipoentero Lavariableesdeslolectura Exportalavariable(equivalenteaexport)
Tabla4.1:Opcionesdelcomandointernodeclare
71
Laopcinideclara(Bashnoexigequesedeclarenlasvariables)lavariabledetipoentero,lo cual permite que podamos realizar operaciones aritmticas con ella. Por ejemplo, si usamos variablesnormalespararealizaroperacionesaritmticas:
$bashvar1=5 $bashvar2=4 $bashresult ado=$var1*$var2 $bashecho$resul tado 5*4
Sinembargo,siahorausamosvariablesdetipoentero:
$bashdeclareivar1=5 $bashdeclareivar2=4 $bashdeclareiresul $bashecho$resul tado 20 tado $bashresult ado=$var1*$var2
Einclusopodemosoperarconvariablesinexistentes:
$bashresult ado=4*var_ine $bashecho$resul tado 0 xi st ent e
Podemossabereltipodeunavariableconlaopcinp.Porejemplo:
$bashdeclarepresultado declareiresultado="24"
Laopcinxesequivalenteausarelcomandoexportsobrelavariable.Ambassonformasde
72
Ademssenosindicasilavariableesdetipoarray(a)oentero(i)
4.2. Expresionesaritmticas
LosvaloresdetodaslasvariablesdelashelldeBashsealmacenanenformadecadenasde caracteres.Aunqueestacaractersticahacequeelprocesamientodedatossimblicosseafcily agradable,tambinhacequeelprocesamientodedatosnumricospresentealgunasdificultades.La raznesquelosdatosenterossealmacenan,enrealidad,enformadecadenasdecaracteres.Para poderrealizaroperacionesaritmticasylgicasconellos,esprecisotraducirlosaenterosyvolvera traducirelresultadoaunacadenadecaracteresparaalmacenarlacorrectamenteenunavariablede lashell. Afortunadamente,enlashelldeBashexistenvariasmanerasderealizaroperacionesaritmticas condatosnumricos:
Utilizandolaexpansindelshell$((expresin)) Utilizandolaordenlet
expanden(sesustituyenlasvariablesporsusvaloresenlaexpresin)ysetraducenaltipoentero largoantesdeefectuarlaevaluacindelaexpresin.
4.2.1. Expansindelshell$((expresin))
Paraqueelshellevaleunaoperacinaritmticaynolatomecomoargumentosdeuncomando, lasexpresionesaritmticasdebernirencerradasentre$((y)).
$((expresin))
Lasexpresionesaritmticas,aligualquelasvariablesylasustitucindecomandos,seevalan dentrodelascomillasdoble().
Basndonosenelcomandodate+%j,quenosdevuelveelnmerode da Juliano, hacer un script que nos diga cuantos das quedan hastaelprximo31deDiciembre. Elcomandosepuedeimplementarrestandoa365daselnmerode dastranscurridosas: $bash echo "$( ( 365 $(dat e +%j ) )) dias par a el 31 de Dic"
Descripcin
74
4.2.2. SimilitudconlasexpresionesaritmticasC
LasexpresionesaritmticasdeBashsehandiseadodeformaequivalentealasexpresionesde C.Porejemplo$((x+=2))aade2ax. Aunquealgunosoperadores(p.e.*olosparntesis)soncaracteresespecialesparaBash,nohace faltaprecederlosporelcarcterdeescapesiemprequeestndentrode $((...)).Igualmente,alas variablesqueestndentrodelaexpresinaritmticanohacefaltaprecederlaspor$paraobtenersu valor. Bash,adems,nospermiteusarlosoperadoresrelacionales(<,>,<=,>=,==,!=)ylgicosdeC (!,&&,||)interpretando,aligualqueC,el1comociertoyel0comofalso.
4.2.3. Elcomandointernolet
El comando interno let nos permite asignar el resultado de una expresin aritmtica a una variable.Tienelasiguientesintaxis:
letvar=expresion
Vemosqueaesdetipocadena,mientrasquesiusamosdeclareinoslacreadetipoentero:
$bashdeclareia=3 $bashdeclarepa declareia="12" *4
4.3. Lassentenciascondicionales
4.3.1. Lassentenciasif,elifyelse
Lasentenciacondicionaltieneelsiguienteformato:
ifcondicin then sentenciasthenif elifcondicin then sentenciasthenelif else sentenciaselse fi
76
4.3.2. Loscdigosdeterminacin
EnUNIXloscomandosterminandevolviendouncdigonumricoalquesellamacdigode terminacin(exitstatus)queindicasielcomandotuvoxitoono. Aunquenoesobligatorioqueseaas,normalmenteuncdigodeterminacin0significaqueel comandotermincorrectamente,yuncdigoentre1y255correspondeaposiblescdigosdeerror. Encualquiercasosiempreconvieneconsultarladocumentacindelcomandoparainterpretarmejor sus cdigos de terminacin. Por ejemplo, el comando diff devuelve 0 cuando no encuentra diferenciasentrelosficheroscomparados,1cuandohaydiferencias,y2cuandoseproducealgn error(p.equeunodelosficherospasadoscomoargumentonosepuedeleer). Lasentenciaifcompruebaelcdigodeterminacindeuncomandoenlacondicin,sistees0 lacondicinseevalacomocierta.Luegolaformanormaldeescribirunasentenciacondicional if es:
ifcomando;then Procesamientonormal else Procesamoselerror fi
77
$bashecho$? 0
Lavariable?debedeserledajuntodespusdeejecutarelcomando,siendomuytpicoguardar suvalorenunavariablect=$?parasuposterioruso.
4.3.3. Lasentenciaexit
Lasentenciaexitpuedeserejecutadaencualquiersitio,yloquehaceesabandonarelscript. Sueleusarseparadetectarsituacioneserrneasquehacenqueelprogramadebadetenerse,aunquea vecesseutilizapara"cerrar"unprograma.
4.3.4. Operadoreslgicosycdigosdeterminacin
Podemoscombinarvarioscdigosdeterminacindecomandosmediantelosoperadoreslgicos and(representadacon&&)or(representadacon||)ynot(representadacon!). Estasoperaciones,aligualqueenotroslenguajescomoCoJava,funcionanenshortcut,esdecir, elsegundooperandosloseevalasielprimeronodeterminaelresultadodelacondicin.Segn estolaoperacin:
ifcd/tmp&&cp001.tmp$HOME;then fi
Ejecutaelcomandocd/tmp,ysi stetiene xito(elcdigodeterminacines0),ejecutael segundocomando cp001.tmp$HOME,perosielprimercomandofalla,yanoseejecutael segundoporqueparaquesecumplalacondicinamboscomandosdeberandetener xito(siun operandofallayanotienesentidoevaluarelotro). Eloperador||porcontraejecutaelprimercomando,yslosi stefallaseejecutaelsegundo. Porejemplo:
ifcp/tmp/001.tmp~/d.tmp||cp/tmp/002.tmp~/d.tmp then
78
fi
4.3.5. Testcondicionales
Lasentenciaiflo nicoquesabeesevaluarcdigosdeterminacin.Peroestonosignificaque slopodamoscomprobarsiuncomandosehaejecutadobien.Elcomandointernotestnospermite comprobarotrasmuchascondiciones,quelepasamoscomoargumento,paraacabardevolvindonos uncdigodeterminacin.
test[condicin]
Una forma alternativa al comando test es el operador [[ ]] dentro del cual metemos la condicinaevaluar
[[condicin]]
esdecir,testcadena1=cadena2esequivalentea[[cadena1=cadena2]].Los espaciosentreloscorchetesylosoperandos,oentrelosoperandosyeloperadordecomparacin = sonobligatorios. Usandolos test condicionales podemosevaluaratributosdeunfichero(siexiste,quetipode ficheroes,quepermisostiene,etc.),comparardosficherosparavercualdeellosesmsreciente, comparar cadenas, e incluso comparar los nmeros que almacenan las cadenas (comparacin numrica).
79
Comparacindecadenas LosoperadoresdecomparacindecadenasseresumenenlaTabla4.3.Lascomparacionesque serealizanconlossmbolos<y>sonlexicogrficas,esdecircomparacionesdediccionario,donde porejemploqesmayorqueperro.Obsrvesequenoexistenoperadores<=y>=yaquesepueden implementarmedianteoperacioneslgicas. Operador str1=str2 str1!=str2 str1<str2 str1>str2 nstr1 zstr1 Verdaderosi... Lascadenassoniguales Lascadenassondistintas str1esmenorlexicogrficamenteastr2 str1esmayorlexicogrficamenteastr2 str1esnonulaytienelongitudmayoracero str1esnula(tienelongitudcero)
Tabla4.3:Operadoresdecomparacindecadenas
Cuandoseutilizanoperadoresdecomparacindecadenas,lasvariablesqueaparezcanenla comparacindebenirencerradasentrecomillasdobles.
fichero=$1 if[[z"$fichero"]];then echo'Use:muestraFichero<fichero>' else cat$fichero fi
80
Comparacinnumricadeenteros Elshelltambinpermitecompararvariablesquealmacenennmeros,paraellosedebende utilizarlosoperadoresdelaTabla4.4 Operador lt le eq ge gt ne Descripcin Menorque Menoroigualque Igualque Mayorigualque Mayorque Diferente
Tabla4.4:Operadoresdecomparacinnumricadecadenas
Tambinesposiblecombinarcomandosdelshellcontestdecondicin:
ifcomando&&[[condicion]];then
81
Porejemplo,lasiguienteoperacincompruebaque$reintegroseamenoroiguala$saldo, yque$reintegroseamenoroiguala$max_cajero:
if[$reintegrole$saldoa$reintegrole$max] then fi
Losparntesisdentrodeexpresionescondicionalesdebenirprecedidosporelcarcterde
escape\(paraevitarqueseinterpretencomounasustitucindecomandos).
Losparntesis,aligualqueloscorchetes,debendeestarseparadosporunespacio.
Luegolaoperacinanteriorsepuedeescribircomo:
if[\($reintegrle$saldo\)a\($reintegrole$max\)] then fi
Comprobaratributosdeficheros Eltercertipodeoperadoresdecomparacinnospermitencompararatributosdefichero.Existen 22operadoresdeestetipoqueseresumenenlaTabla4.5. Operador afichero bfichero cfichero dfichero efichero ffichero ficheroexiste ficheroexisteyesundispositivodebloque ficheroexisteyesundispositivodecarcter ficheroexisteyesundirectorio ficheroexiste(equivalenteaa) ficheroexisteyesunficheroregular Verdaderosi...
82
Operador gfichero Gfichero hfichero kfichero Lfichero Nfichero Ofichero pfichero rfichero sfichero Sfichero ufichero wfichero xfichero
Verdaderosi... ficheroexisteytieneactivoelbitdeseguridad ficheroexisteyesposedoporelgrupoIDefectivo ficheroexisteyesunenlacesimblico ficheroexisteytieneelstrickybitactivado ficheroexisteyesunenlacesimblico ficheroexisteyfuemodificadodesdelaltimalectura ficheroexisteyesposedoporelgrupoIDefectivo ficheroexisteyesunpipeonamedpipe ficheroexisteypodemosleerlo ficheroexisteynoestavaco ficheroexisteyesunsocket ficheroexisteytieneactivoelbitdesetuid ficheroexisteytenemospermisodeescritura fichero existe y tenemos permiso de ejecucin, o de bsquedasiesundirectorio
Elscriptsiguientemuestraelusodeestoatributosenunejemplo.Elscriptcopiaunarchivo pasadocomoargumentoenundirectoriotambinpasadoporargumento.Compruebaqueelfichero y el directorio existan y, adems, que no exista un fichero con el mismo nombre dentro del directorio.
83
#!/bin/bash #Declaraciondevariables numArg=$# if[[$numArg!=2]] then echo$0"<fichero><directorio>" else #Comprobacionessobreelprimerargumento:fichero if[[a$1]]#Miramossiexisteelprimerargumento then echo"$1existe" if[[f$1]]#Miramossielargumentoesunfichero then echo"$1esunfichero" else echo"$1noesunfichero" exit fi else echo"$1noexiste" exit fi #Comprobacionessobreelsegundoargumento:directorio if[[a$2]] then echo"$2existe" if[[d$2]]#Comprobamossiesundirectorio then echo"$2esundirectorio" else echo"$2noesundirectorio" exit fi else echo"$2noexiste"
84
4.3.6. Ifaritmtico
Lasexpresionesaritmticaspuedenusarseenlasdistintassentenciasdecontroldeflujo,encuyo casolaexpresinvaentredoblesparntesis,perosinel $ delante,porejemplo,el if aritmtico tendralaforma:
if((expresinaritmtica)) then cuerpo fi
4.4. Elbuclefor
ElbucleforenBashesunpocodistintoalosbucles fortradicionalesdelenguajescomoCo Java;enrealidad,separecemsalbucleforeachdeotroslenguajes,yaqueaqu noserepiteun nmerofijodeveces,sinoqueseprocesanloselementosdeunalistaunoauno.
85
Susintaxiseslasiguiente:
forvar[inlista] do listaderdenes done
La lista del bucle for puede contener comodines. Por ejemplo, el siguiente bucle muestra informacindetalladadetodoslosficheroseneldirectorioactual:
forficheroin* do lsl"$fichero" done
#Buclesquerecorrenlosargumentos forargin$* do echo"Elemento:$arg" done IFS='' dobles() forargin$* do echo"Elemento2:$arg" done #Cambiamoseldelimitadoralascomillas
Siahoraloejecutamos,obtenemoslasiguientesalida:
$bashrecibe.s h"Elperro""Lacasa" Elemento:El Elemento:perro Elemento:La Elemento:casa Elemento2:Elperro Elemento2:Lacasa
87
4.5. Bucleswhileyuntil
Los bucles while y until son tiles cuando los combinamos con caractersticas como la aritmticaconenteros,laentradaysalidadevariables,yelprocesamientodeopcionesdelalnea decomandos.Susintaxises:
whilecondicin do listaderdenes done untilcondicin do listaderdenes done
while ejecutalas rdenesespecificadasen listade rdenes mientraselresultadodeevaluar condicin sigasiendotrue.Porsuparte, until ejecutalas rdenesespecificadasen listade rdenesmientraselresultadodeevaluarcondicinseafalse. Unejemplodelusodelwhileeselsiguiente:
#!/bin/bash i=0 while[[$ilt10]] do echoElcontadores$i leti=i+1 done
EstescriptemulalaestructurafordeC,Pascal,... Otroejemploconuntil:
#!/bin/bash i=20
88
Tantoenelbucleforcomoenelwhile,podemosusarbreakparaindicarquequeremossalirdel bucleencualquiermomento.Elsiguientescriptimplementaeljuegodeadivinarunnmero.
#!/bin/bash MINUM=8 while[[1]];do echo"Introduzcaunnmero:" readUSER_NUM if[[$USER_NUMlt$MINUM]];then echo"Elnmerointroducidoesmenorqueelmo" echo"" elif[[$USER_NUMgt$MINUM]];then echo"Elnmerointroducidoesmayorqueelmo" echo"" elif[[$USER_NUMeq$MINUM]];then echo"Acertaste:Minmeroera$MINUM" break fi done #Comandosinferiores... echo"Elscriptsalidelbucle.Terminando..." exit
La condicin del bucle while, test 1, siempre retornar TRUE, y el bucle se ejecutar infinitamente,preguntandoencadavueltaporunnuevonmero.Sielnmerointroducidoesel mismo que el valor de $MINUM (nmero a adivinar), break har que se salga del bucle y continenejecutndoseloscomandosinferiores. Whilearitmtico Aligualqueocurraconelforyelif,tambinexisteelwhilearitmtico.Tendralaforma:
89
4.6. Entradaysalidadetexto
Enesteapartadocomentaremosdetalladamenteloscomandos echo,printfyread,loscuales nospermitenrealizarlasoperacionesdeentrada/salidaquerequiereunscript.
4.6.1. Elcomandointernoecho
Comoyasabemos,echosimplementeescribeenlasalidaestndarlosargumentosquerecibe. LaTabla4.6muestralasopcionesquepodemospasarleaecho. Opcin e E n Descripcin Activalainterpretacindecaracteresprecedidosporelcarcterdeescape. Desactivalainterpretacindecaracteresprecedidosporcarcterdeescape.Esla opcinpordefecto. Omiteelcarcter\nalfinaldelalnea(esequivalentealasecuenciadeescape\c).
Tabla4.6:Opcionesdelcomandoecho
deescape\esinterpretadoporelshellynoporecho. Secuenciadeescape \a \b \c \f \n \r \t Descripcin Produceunsonidopoom(alert) Borrarhaciaatrs(backspace) Omiteel\nalfinal(esequivalentealaopcinn. Debecolocarsealfinaldelalnea Cambiodepginadeimpresora Cambiodelnea Retornodecarro Tabulador
Tabla4.7:Secuenciasdeescapedelcomandoecho
91
4.6.2. Elcomandointernoprintf
Aunqueelcomandoechoessuficienteenlamayoradeloscasos,enocasiones,especialmentea lahoradeformateartextoenpantalla,esnecesariomsflexibilidad.Paraestoscasosseutilizael comandoprintf. Estecomando,enprincipio,puedeescribircadenasigualqueecho:
$bashprintf "Hola mundo" Holamundo
Sinembargo,adiferenciadeechonoimprimeelcambiodelneadelfinalpordefecto,sinoque debemos indicarlo explcitamente (\n). Adems, printf por defecto interpreta las secuencias de escape.
$bashprintf "Hola mundo\ n" Holamundo
Elformatodeestecomandoesmuyparecidoaldelafuncinprintf()deC:
printfcadenaformato[argumentos]
Dentro de la cadena de formato que recibe como primer argumento pueden aparecer especificadoresdeformato,loscualesempiezanpor%ysedescribenenlaTabla4.8. Especificador %c %d %i %e %E %f %o %s %b Descripcin Imprimeelprimercarcterdeunavariablecadena Imprimeunnmerodecimal Igualque%d Formatoexponencialb.precisione[+]e Formatoexponencialb.precisionE[+]e Nmeroencomaflotanteb.precision Octalsinsigno Cadena(string) Interpretalassecuenciasdeescapedelargumentocadena
92
Especificador %q %u %x %X %%
Unejemplodeusodelosespecificadoresdeformatoeselsiguiente:
$bashn=30 $bashnomb re=F er nando $bashprintf "El client e%des %s\n" $n$no mb re Elcliente30esFernando
Elespecificadordeformatotieneelsiguienteformatogeneral:
%[Flag][Ancho][.Precisin]Especificador
SiqueremosindicarunmximoparalacadenadebemosdeusarelcampoPrecisin:
$bashprintf "|% 10.10s|\n" " Fer nand oLope z" |FernandoL|
ElFlagseusaparaindicarquequeremosalienaralaizquierda:
$bashprintf "|% 10s|\n" Hola |Hola|
93
Dosvariantesde%sson%by%q.Elespecificadordeformato%bhacequeseinterpretenlas secuenciasdeescapedelosargumentos.Esdecir:
$bashprintf "%s\n" "Hola \n Adio s" Hola\nAdios $bashprintf "%b\n" "Hola \n Adio s" Hola Adios
94
Flag
Descripcin nmerosenhexadecimal%xy%X
Tabla4.9:Flagsdelosespecificadoresdeformatoparanmeros
Porejemplo:
$bashprintf "|%+1 0d|\n" 56 |+56| $bashprintf "|%0 10d|\n" 56 |0000000056| $bashprintf "|%x|\ n"56 |38| $bashprintf "|%#x| \n" 56 |0x38|
4.6.3. Elcomandointernoread
Elcomandoreadsirveparaleerinformacindeltecladoyguardarlaenvariables.Susintaxises:
readvar1var2...
Esta sentencia lee una lnea de la entrada estndar y la parte en palabras separadas por el smboloqueindiquelavariableIFS(pordefectoespaciootabulador).Laspalabrasseasignana var1, var2, etc.Sihaymspalabrasquevariables,las ltimaspalabrasse asignanala ltima variable.Porejemplo:
$bashreadvar1 var2 var3 Estoesunaprueba $bashecho$var1 Esto $bashecho$var2 es $bashecho$var3 unaprueba
Siomitimoslasvariables,lalneaenteraseasignaalavariableREPLY
95
96
4.7.- Ejercicios
4.7. Ejercicios
Todoslosscriptsplanteadosdeberntener
Uncomentariosalprincipioqueindiqueloquehace. Comentariosalolargodelscriptparadocumentarloquesevahaciendo En el caso de recibir parmetros, comprobacin de que el numero de parmetros recibidosescorrecto,mostrandoencasocontrariounmensajeconlasintaxis.
1.CreaunscriptdenombrepositivoNegativo.shquepidaunnumeroportecladoydetermine siespositivo,negativoocero. 2.Creaunscriptquesellamecopiar.shyqueaceptedosargumentos.Elprimerargumento representaelnombredeunarchivoexistentecuyocontenidoqueremoscopiaryelsegundo argumento es el nombre del fichero donde se copiar el contenido. El scritp copiar el contenido del primer fichero en el segundo fichero, haciendo todas la comprobaciones pertinentes a) Elnmerodeargumentosalllamaralprogramadebeserelcorrecto,sinomandarun mensajeindicandolasintaxiscorrecta. b) Elficheroodirectoriodadocomoprimerargumentodebeexistir,sinoexistedebe mandarseunmensajedeerroralusuarioyfinalizar. c) El segundo argumento no debe corresponder con ningn archivo o directorio existentes,siloes,sedebemandarunmensajealusuarioyfinalizar. 3.Desarrollaunscriptdenombrecal.shqueimplementeunacalculadoraconlasoperaciones bsicas(suma,resta,multiplicacin,divisin,potencia).Nota:Sepuedehacerenmenosde cuatrolneasdecdigo. 4.Escribeunscriptllamado sumaN.sh quepidaunnmero(N)eimprimaporpantallala
97
4.7.- Ejercicios
sumadelosNprimerosnmeros. 5.DesarrollaunscriptdenombreficheroDirectorio.shquerecibaunnmeroindeterminado deparmetros.Elscriptdeber clasificarlosargumentossegnseanficherosodirectoriosy guardarlosendosarchivos(fich.txtydir.txt). 6.Creaunscriptdenombre muestraLinea.sh querecibadosargumentosenlalnea de rdenes;elprimeroserunficheroyelsegundounnmeron .Elscriptmostrarporpantalla lalneanmeron delficheropasadocomoargumento.Silalneanoexistiese,elscriptdeber mostrarelmensajecorrespondiente. 7.Hazunscriptllamado ocupaTxt.sh quedadoundirectoriocomoargumentonosdigael tamaototaldelosficheroconextensin.txtquehayaenl.
98
5. PROGRAMACINBASHII
5.1. Lasentenciacase
MientrasqueestasentenciaenlenguajescomoCoJavaseusaparacomprobarelvalordeuna variable simple, como un entero o un carcter, en Bash esta sentencia permite realizar una comparacindepatronesconlacadenaaexaminar. Susintaxiseslasiguiente:
casecadenain patron1) Listaderdenes1;; patron2) Listaderdenes2;; esac
Lasentenciacasecomparaelvalorpresenteencadenaconlosvaloresdetodoslospatrones, unoporuno,hastaqueobienseencuentraunpatrnquecoincidaoyanoquedanmspatronespara comparar con cadena. Si se halla un coincidencia, se ejecutan las rdenes presentes en la correspondientelistaordenesylasentenciacasecedeelcontrol. Cadapatrnpuedeestarformadoporvariospatronesseparadosporelcarcter|.
#!/bin/bash readn case$nin *1*|*5*)echoUnooCinco;; *2*)echoDos;; *3*)echoTres;; *4*)echoCuatro;; esac
99
En una aplicacin tpica de la sentencia, se incluye un patrn comodn que coincide con cualquierposiblevalordecadena.Seconocecomocasoporomisinypermitelaejecucindeun conjunto de rdenes adecuadas para manejar una situacin excepcional cuando cadena no coincideconningnpatrn.
#!/bin/bash readn case$nin *1*|*5*)echoUnooCinco;; *2*)echoDos;; *3*)echoTres;; *4*)echoCuatro;; *)echoOpcinincorrecta;; esac
5.2. Lasentenciaselect
Lasentenciaselectnospermitegenerarfcilmenteunmensimple.Susintaxiseslasiguiente:
selectvariable[inlista] do Sentenciasqueusan$variable done
Vemosquetienelamismasintaxisqueelbuclefor,exceptoporlapalabrareservadaselecten vezdefor.Dehecho,siomitimosinlista,tambinseusapordefecto$@. Lasentenciageneraunmen conloselementosdelista,asignaunnmeroacadaelemento,y pidealusuarioqueintroduzcaunnmero.Elvalorelegidosealmacenaenvariable,yelnmero elegidoenlavariable REPLY.Unavezelegidaunaopcinporpartedelusuario,seejecutael cuerpodelasentenciayelprocesoserepiteenunbucleinfinito. Aunqueelbuclede select esinfinito(locualnospermitevolverapedirunaopcincuantas veceshagafalta),sepuedeabandonarusandolasentenciabreak.Lasentenciabreak,aligualque enCyJava,seusaparaabandonarunbucleysepuedeusarenelcaso,tantode select,comodelos
100
101
LavariableOPCIONESseutilizaparaalmacenarlasopcionesdelmen(laformadesepararlas opcionesdependerdelavariableIFS).Unejemplodeejecucineselsiguiente:
mluque@tweety:/tmp$./pru.sh Numero1:8 Numero2:2 1)Sumar 2)Restar 3)Multiplicar 4)Dividir 5)Salir Elijaunaopcion:4 4 Elijaunaopcion:5 Fin
5.3. Lasentenciashift
Lasentenciashift,pordefecto,desplazalosargumentosdelalneaderdenesunaposicina laizquierda,haciendoque$2paseaser$1,$3paseaser$2,yas sucesivamente.Elnmerode posicionesquesedesplazanpuedesermayorqueunoyseespecificacomoargumentodelaorden. Suformatoeselsiguiente:
shift[n]
Luego,siejecutamoselcomando shift1,$1pasar acontenerelvalorde$2,$2elde$3yas sucesivamente.Elvalorde$1sepierde. Unejemploclsicodelusodeestecomandosonlosscriptsconopciones.Lasopciones,aligual quelosargumentosserecibenenlosparmetrosposicionales,esdecir,siejecutamos hacero esto.txtaquello.txt,en$1recibimoso,en$2esto.txtyen$3aquello.txt.En principio, paratratarlasopcionesnonos harafaltasabernadams.Elproblemaest en que normalmentelasopcionessonopcionales,esdecir,puedendarseono,conloqueenfuncinde quelaopcinsedeono,elscriptutilizarunosparmetrosposicionalesuotros
if[[$1=o]] then Ejecutalasoperacionescon$2y$3 else Ejecutalasoperacionescon$1y$2 fi
Utilizandoelcomandoshiftpodemosresolverestoyhacerelscriptanteriormssencillo:
if[[$1=o]];then Procesao shift fi Ejecutalaoperacincon$1y$2
5.4. Listas(Arrays)
Bashadmitelaslistasunidimensionales.Unalista(array)esunacoleccindeelementosdotada denombre;loselementossontodosdelmismotipoyestnalmacenadosenposicionesconsecutivas dememoria.Loselementosdelalistaestnnumerados,yelprimerelementodelistatiene el nmero0.Noexistelmiteparaeltamaodeunalista,ynoserequierequeloselementosdelalista seasignendeformacontigua. Creacindelistas Paradeclararunlistapodemosusarelcomandodeclareadelasiguienteforma:
103
bash$ declareaA
SiahorapreguntamosporlavariableA,nosdicequeesunarrayvaco:
bash$ declarepA declareaA='()'
Realmente no hace falta declarar una lista con declare a, podemos crearla asignndole directamentevaloresdelasiguientemanera:
bash$ B=(Jamo n4 Melon) bash$ declarepB declareaB='([0]="Jamon"[1]="4"[2]="Melon")'
Loselementosenlaslistasempiezanacontaren0,aunquepodemoscambiarlosndicesdelos elementosindicndolosexplcitamente:
bash$ C=([5]= Melon [0]=Ja mon [3]=400) bash$ declarepC declareaC='([0]="Jamon"[3]="400"[5]="Melon")'
104
[3]="Movies"[4]="Music"[5]=Pictures")
Sinoindicamosndicedeelemento,pordefectonoscogeelelementodendice0:
bash$ echo$B Desktop
Estaeslaraznporlaquehayqueencerrarloselementosentrellaves,porquesinosiemprenos cogeelprimerelemento:
bash$ echo$B[ 3] Movies[3]
Tambin podemos inicializar una lista introduciendo valores directamente con el operador corchete:
bash$ D[2]=Ca sa bash$ D[0]=A vion bash$ declarepD declareaD='([0]="Avion"[2]="Casa")'
Podemosusarlosndicesespeciales*y@,loscualesretornantodosloselementosdelalistade la misma forma que lo hacen los parmetros posicionales. Cuando no estn encerrados entre comillasdobles()ambosdevuelvenunacadenaconloselementosseparadosporespacio,pero cuandoseencierranentrecomillasdobles()@devuelveunacadenaconloselementosseparados por espacio, y * devuelve una cadena con los elementos separados por el valor de IFS. En cualquieradeloscasos,lalistasepierde,yloquerecibimosesunacadenadecaracteres
bash$ IFS=, bash$ echo${C [*]}
105
CosaCasaPerro bash$ echo${C [@]} CosaCasaPerro bash$ echo"${ C[@]}" CosaCasaPerro bash$ echo"${ C[*]}" Cosa,Casa,Perro
Aligualqueenlosparmetrosposicionales,podemositerarsobreloselementosdeunalista usandounbuclefor:
forein${C[*]} do echo$e done
Dondealser${C[*]}unacadenadecaractereshubiramostambinpodidousar${C[@]}o "${C[@]}"perosihacemos"${C[*]}"loqueobtenemosesunacadenaconloselementosde staseparadosporelvalordeIFS(comaenesteejemplo),ynoporespacio.Sinembargoelbucle hubierafuncionadosiloselementosestnseparadosporelvalordeIFS,ydehechoenocasiones (p.e.cuandoloselementostienenespacios)convieneutilizarestaltimasolucin. Loselementosdeunalistaalosquenoseasignavalortienenunacadenanula,conloqueel bucleanteriorsloimprimiraloselementosqueexistanenlalistaC. Podemosconsultarlalongituddeunalistausandolaforma ${#lista[@]},donde lista esel nombredelalista.Porejemplo,enelejercicioanterior:
bash$ echo${# C[@]} 3
106
Siasignamosunalistaaotraexistentesepierdenlosvaloresexistentes,yseasignanlosnuevos. Porejemplo,siaCdelejemploanteriorleasignamos:
bash$ C=(Hola "Que t al" A dios) bash$ declarepC declareaC='([0]="Hola"[1]="Quetal"[2]="Adios")'
Obienborrartodolalistausandounsetsobreelnombredelarray:
bash$ uns etC bash$ declarepC bash:declare:C:notfound
Obsrvesequeestecomportamientoesdistintoaldeasignarunvaloralnombredelalista,que loquehaceesasignrseloalelementodendice0.
107
5.5. Funciones
Comoencasitodolenguajedeprogramacin,podemosutilizarfuncionesparaagrupartrozosde cdigosdeunamaneramslgica,opracticareldivinoartedelarecursividad. LasfuncionesdeBashsonunaextensindelasfuncionesqueexistendesdeelBourneShell. stas,adiferenciadelosscripts,seejecutandentrodelamemoriadelpropioprocesodeBash, conloquesonmseficientesqueejecutarscriptsaparte,perotienenelinconvenientedequetienen queestarsiemprecargadasenlamemoriadelprocesoparapoderusarse.Actualmente,debidoala grancantidaddememoriaquetienenlosordenadores,eltenerfuncionescargadasenlamemoriade tieneuncosteinsignificante,conloquenoimportatenercargadasgrancantidadde stasenel entorno. Definicindefunciones Antesdeutilizarunafuncin,esprecisodefinirla.Laformadedefinirunafuncinenbashes:
nombre_funcin() { comandosbash }
Paraborrarunafuncinpodemosusarelcomandounsetconlasiguientesintaxis
unsetfnombre_funcin.
108
5.5.- Funciones
Cuandodefinimosunafuncin,sealmacenacomounavariabledeentorno.Paraejecutarla funcin,simplementeescribimossunombreseguidodeargumentos,comocuandoejecutamosun comando.Losargumentosactancomoparmetrosdelafuncin. Podemosverquefuncionestenemosdefinidasenunasesinusandoelcomandodeclaref.El shellimprimelasfunciones,ysudefinicin,ordenadasalfabticamente.Sipreferimosobtenerslo elnombredelasfunciones,podemosusarelcomandodeclareF. Siunafuncintieneelmismonombrequeunscriptoejecutable,lafuncintienepreferencia: Estareglasehausadomuchasvecespara,engaandoalosusuarios,violarlaintegridaddesu sistema. Unejemplosencillodelusodefuncioneeselsiguientescript.Enlsecreandosfunciones,una parasaliryotraparamostrarelmensajehola.
#!/bin/bash #Definimosdosfunciones salir(){ exit } hola(){ echo<Hola! } #Comienzaelscript hola #Llamamosalafuncionhola salir#Llamamosalafuncionsalir echoFindelscript
Lasfuncionesnonecesitanserdeclaradasenunordenespecfico.Elscriptalejecutarsellama primeroalafuncinhola,mostrandoelmensajedeHola!,acontinuacinllamaalafuncin salir yterminaelscript.Elprogramanuncallegaraalaltimalnea. Elsiguientescriptesprcticamenteidnticoalanterior.Ladiferenciaest enquelafuncin imprime muestra un mensaje que le pasemos como argumento. Los argumentos, dentro de las funciones,sontratadosdelamismamaneraquelosargumentossuministradosalscript.
109
5.5.- Funciones
#!/bin/bash #Definimosdosfunciones salir(){ exit } imprime(){ echo$1 } #Comienzaelscript imprimeHola#LlamamosalafuncineconelargumentoHola imprimeAdios#LlamamosalafuncineconelargumentoAdios salir#Llamamosalafuncinsalir echoFindelscript
5.6. Operadoresdecadena
Los operadores de cadena nos permiten manipular cadenas sin necesidad de escribir complicadas rutinas de procesamiento de texto. En particular, los operadores de cadena nos permitenrealizarlassiguientesoperaciones:
Empezaremosviendolosoperadoresdesustitucin,paraluegoverlosdebsquedadecadenas.
5.6.1. Operadoresdesustitucin
LaTabla5.1muestralosoperadoresdesustitucin. Operador ${var:valor} ${var:+valor} Descripcin Sivarexisteynoesnularetornasucontenido, sino,retornavalor. Sivarexisteynoesnularetornavalor,sino,
110
Operador
Descripcin retornaunacadenanula.
${var:=valor}
Sivarexisteynoesnularetornasucontenido, sino,asignavaloravaryretornasu contenido. Sivarexisteynoesnularetornasucontenido, sino,imprimevar:mensajeyabortaelscript queseestejecutando(sloenshellsno interactivos).Siomitimosmensajeimprimeel mensajepordefectoparameternullor notset. Retornaunasubcadenadevarqueempiezaen offsetytienelongitudcaracteres.El primercarcterdevarempiezaenlaposicin0. Siseomitelongitudlasubcadenaempiezaen offsetycontinuahastaelfinaldevar.
Tabla5.1:Operadoresdesustitucin
${var:?mensaje}
${var:offset:longitud}
Losdospuntos(:)enesteoperadorsonopcionales.Siseomitenenvezdecomprobarsiexistey noesnulo,slocompruebaqueexista(aunqueseanulo). ${var:valor} seutilizapararetornarunvalorpordefectocuandoelcontenidodelavariable var est indefinido.Porejemplo, ${nombre:1} devuelve1sielcontenidode nombre est indefinidooesnulo. ${var:+valor}porcontraseutilizaparacomprobarqueunavariabletengaasignadounvalorno nulo.Porejemplo,${nombre:+1}retorna1(quesepuedeinterpretarcomoverdadero)sinombre tieneunvalorasignado. Losdosoperadoresdecadenaanterioresnomodificanelvalordelavariablevar,simplemente devuelvensucontenido,siqueremosmodificar var podemosusar ${var:=valor} queasignaun valoralavariablesistaestindefinida.Porejemplo,${nombre:=Paco}asignaPacoala variablenombresistanotienevalor. Tambin podemos querer detectar errores producidos porque una variable no tenga valor
111
asignado. En estecaso,usamos ${var:?mensaje} quedetectasi var notienevalorasignado y produceunmensajedeerror.Porejemplo,${nombre:?'Eresunapersonaannima'} imprimenombre:Eresunapersonaannima Porltimo,podemoscogerpartesdeunacadenausando ${var:offset:longitud}.Porejemplo,si nombre valeFernandoLpez, ${nombre:0:8} devuelveFernandoy ${nombre:9} devuelve Lpez. Ejemplo Imaginemosquetenemosunficheroconelsaldoyelnombredeunconjuntodeclientesconla siguienteforma:
bash$ catcli en tes 45340JoseCarlosMartinez 24520MariCarmenGutierrez 450LuisGarciaSantos 44MarcosVallidoGrandes 500CarlosdelaFuenteLopez
Por:
fichero=${1:?'nosuministrado'}
Ahora,sinosuministramoselargumentoseproduceelmensaje:
./mejoresclientes:1:nosuministrado
Podemosmejorarlalegibilidaddeestemensajesihacemos:
fichero_clientes=$1 fichero_clientes=${fichero_clientes:?'nosuministrado'}
Ahorasiolvidamosproporcionarelargumentovemoselmensaje:
./mejoresclientes.sh:fichero_clientes:nosuministrado
113
Paraverunejemplodeloperadordecadena:=podramoscambiar:
cuantos=$2
Por:
cuantos=${2:=5}
Peroestonofuncionaporqueestamosintentandoasignarunvaloraunparmetrosposicional (quesondeslolectura).Loquespodemoshaceres:
cuantos=$2 sortnr$fichero_clientes|head${cuantos:=$defecto}
Elscriptmstoleranteafallosseraelsiguiente:
#Scriptquesacalosmejoresclientes #Tienelaforma #mejoresclientes<fichero>[<cuantos>] fichero_clientes=$1 fichero_clientes=${fichero_clientes:?'nosuministrado'} cuantos=$2 defecto=5 sortnr$fichero_clientes|head${cuantos:=$defecto}
5.6.2. Operadoresdebsquedadepatrones
En la Tabla 5.2, se muestran los operadores de bsqueda de patrones existentes y una descripcindesucomportamiento. Operador ${var#patron} Descripcin Sipatroncoincideconeliniciodelvalordevar, borralapartemspequeaquecoincidey retornaelresto. Sipatroncoincideconeliniciodelvalorde var,borralapartemsgrandequecoincidey retornaelresto. Sipatroncoincideconelfinaldelvalordevar, borralapartemspequeaquecoincidey
114
${var##patron} ${var%patron}
Descripcin
Sipatroncoincideconelfinaldelvalordevar, borralapartemsgrandequecoincideyretorna elresto. Lapartemsgrandedepatronquecoincideen varesreemplazadaporcadena.Laprimera formasloreemplazalaprimeraocurrencia,yla segundaformareemplazatodaslasocurrencias. Sipatronempiezapor#debeproducirsela coincidenciaalprincipiodevar,ysiempieza por%debeproducirselacoincidenciaalfinal devar.Sicadenaesnula,seborranlas ocurrencias.Enningncasovarsemodifica, sloseretornasuvalorconmodificaciones.
${var/patron/cadena} ${var//patron/cadena}
Tabla5.2:Operadoresdebsquedadepatrones
En la bsqueda de patrones se pueden usar tanto los comodines tradicionales como los extendidos.
115
Ejemplo EnelmundodeGNUexistenunasherramientasllamadasNetPBM1quepermitenconvertir entremuchosformatosgrficos.Laherramientasueleconvertirdeformatosconocidos(gif,bmp, jpg) a un formato interno, o bien del formato interno a los formatos conocidos. Los formatos internosqueutilizason .ppm (PortablePixelMap)paraimgenesencolor,.pgm (PortableGray Map)paraimgenesenescaladegrises,y.pbm (PortableBitMap)paraimgenesformadaspor bitsdeblancoynegro.Avecesestosformatosaparecenbajolaextensingeneral.pnm,queabarca atodosellos.Nuestroobjetivoeshacerunscriptllamadobmptojpgquerecibaunoodosnombres defichero,elprimerodetipo.bmp yelsegundodetipo .jpg.Sinosesuministraelsegundo argumento,elnombredelficheroserelmismoqueeldelprimerargumentoperoconlaextensin .jpg.PararealizarlasconversionesusaremosloscomandosdeNetPBMbmptoppmyppmtojpeg. Loscomandosrecibencomoargumentoelficheroorigenyemitenporlasalidaestndarel ficheroenelformatodestino. Paraobtenerelprimerargumento,odarerrorsinosenossuministra,podemosusareloperador :?as:
fichero_entrada=${1:?'faltaargumento'}
Paraobtenerlosnombresdeficherointermedioydesalidausamos:
fichero_intermedio=${fichero_entrada%.bmp}.ppm fichero_salida=${2:${fichero_intermedio%.ppm}.jpg}
116
5.6.3. Eloperadorlongitud
Eloperadorlongitudnospermiteobtenerlalongitud(encaracteres)delvalordeunavariable. Tienelaforma${#var}dondevareslavariableacuyocontenidoqueremosmedirlalongitud.Por ejemplo,silavariablenombrevaleFernando,${#nombre}devolver8.
5.7. Sustitucindecomandos
Lasustitucindecomandospermiteusarlasalidadeuncomandocomosifueraelvalordeuna variable. Lasintaxisdelasustitucindecomandoses:
$(comando)
Tambinsepuedehacerutilizandolascomillasfrancesas,aunqueestanuevaformapermite anidarsustitucionesdecomandos. Unejemplodeusodelasustitucindecomandoses $(pwd),quenosdevuelveeldirectorio actual,yesequivalentealeerlavariabledeentorno$PWD. Otro ejemplo es el uso de $(ls $HOME), esta sustitucin de comandos nos devuelve una variablecontodoslosficherosdeldirectoriohome:
bash$ midir=$ (ls $HOME) bash$ echo$mi dir DesktopDocumentsLibraryMoviesMusicPicturesPublic Sitesautorjdevhometmpxcode
Tambin podemos cargar el contenido de un fichero en una variable de entorno usando $(<fichero),dondeficheroeselficheroacargar.Porejemplo,paracargarelcontenidodelfichero copyright.txtenlavariablecopyrighthacemos:
bash$ co pyr ight=$(< co pyr ight.tx t)
117
Laopcinlhacequegrepdevuelvaslolosnombresdeficherodondehaencontradolapalabra 'bash'.
5.8. LosficherosdeconfiguracindeBash
Cadavezqueentramosanuestracuentaseejecutaelcontenidodelfichero/etc/profile,yluego semiraaversieneldirectorio home existeelfichero.bash_profile,deseras seejecutasu contenidoparapersonalizaraspectosdenuestracuenta. Cualquierconfiguracinqueaadamosa.bash_profilenoserefectivahastaquesalgamosdela cuentayvolvamosaconectarnos,sihacemoscambiosenesteficheroyqueremosverlossinsalirde lacuentapodemosusarelcomandosource,elcualejecutaelcontenidodelficheroqueledigamos:
bash$ sour ce.ba sh_pr ofile
Bashpermiteusardosnombresalternativospara .bash_profile porrazonesdecompatibilidad histrica:.bash_login,nombrederivadodelfichero.logindelCShell,y.profilenombreusadopor elBourneShellyelKornShell.Encualquiercaso,slounodeestosficherosser ejecutado.Si .bash_profileexistelosdemssernignorados,sinoBashcompruebasiexiste.bash_loginy,slo si stetampocoexiste,compruebasiexiste .profile.Laraznporlaqueseeligi esteordende bsqueda es que podemos almacenar en .profile opciones propias del Bourne Shell, y aadir opcionesexclusivasdeBashenelfichero.bash_profileseguidodelcomandosource.profilepara queBashtambincarguelasopcionesdelfichero.profile. .bash_profileseejecutasloalentrarporprimeravez,siabrimosotroshell(ejecutandobash) desde la lneadecomandosdeBashloquese intenta ejecutar es elcontenidode .bashrc. Si .bashrcnoexiste,noseejecutanconfiguracionesadicionalesalabrirunnuevoshell.Esteesquema
118
nospermitesepararconfiguracionesquesehacenunasolavez,alconectarnos,deconfiguraciones quesecambiancadavezqueseabreunnuevoshell.Sihayconfiguracionesen .bashrcquetambin queremosejecutaralconectarnos,podemosponersource.bashrcdentrodelfichero.bash_profile. Por ltimo, el fichero .bash_logout es un fichero que, de existir, contiene rdenes que se ejecutarnalabandonarlacuenta,porejemploeliminarficherostemporalesoalmacenardatosde actividaddeusuariosenunficherodelog.
119
5.9.- Ejercicios
5.9. Ejercicios
Todoslosscriptsplanteadosdeberntener
Uncomentarioalprincipioqueindiqueloquehace. Comentariosalolargodelscriptdeloquesevahaciendo En el caso de recibir parmetros, comprobacin de que el numero de parmetros recibidosescorrecto,mostrandoencasocontrariounmensajeconlasintaxis.
1.Creaunscriptdenombreopciones.shquepuedatenerunadeestasdossintaxis: opciones.shofichero1fichero2 opciones.shfichero1fichero2 El script, en cualquiera de los dos casos, copiar el fichero1 en el fichero2, comprobando que fichero1 existe y que fichero2 no existe. Si se utiliza para su ejecucinlaprimerasintaxis(conlaopcino),elscriptcopiar fichero1enfichero2 peroordenandopreviamentefichero1.Utilizalasentenciashiftparacontrolarlaopcin. 2.Desarrolla el script mezclaFicheros.sh que reciba un nmero indeterminado de parmetros. Los n primeros sern ficheros con el mismo nmero de lneas, y el ltimo parmetroser elficherodesalida.Elscriptdeber mezclarlaslneasdelos n primeros ficherosyguardarlasenelficherodesalida.Elnmeromnimodeparmetrosaprocesarpor elscriptser de3,noestandolimitadoelnmeromximo.Sifuerainvocadoconmenos parmetrosmostrarelcorrespondientemensajedeerror. 3. Crea un script, de nombre ordenaParametros.sh, que enve ordenados a la salida estndarlosparmetrosquerecibeporlalneaderdenes.Elnmeromnimodeparmetrosa procesarporelscriptserde2,noestandolimitadoelnmeromximo.Sifuerainvocadocon menosparmetrosmostrar enlasalidadeerrorestndarunmensajeenelqueseindiquela
120
5.9.- Ejercicios
formadeinvocarlo. 4. Realizaunscriptllamado menuFicheros.sh querecibacomoargumentounficheroo directorio. El script, a travs de un men, realizar las siguientes operaciones sobre el argumentorecibido: a) Contarelnmerodeficherosquehayeneldirectorio.Sielargumentoqueselepasaes unfichero,debermostrarelcorrespondientemensajedeerror. b) Mostrareltamaodelfichero c) Crearelfichero(antesdeberasegurarsedequenoexiste). d) Mostrarinformacinsobreelfichero(nombre,permisosquetiene,propietario,...) 5.Crea un script de nombre cambiaExtension.sh que reciba como argumentos dos extensiones. El script deber cambiar la extensin de todos los ficheros que tengan la extensinpasadacomoprimerargumentoporlaextensinpasadacomosegundoargumento. 6.LosdirectoriosdebsquedaquealmacenalavariabledeentornoPATHavecesresultan difcilesdeverdebidoaquecuestaencontrareldelimitadordospuntos(:).Escribeunscript llamadoverpath.shquemuestrelosdirectoriosdelPATHunoencadalnea. 7.Hazunafuncinquerecibacomoparmetroelnombredeunficheroydevuelvaelnmero depalabrasqueempiezanporAenl.Utilizaestafuncinenunscriptllamadofunciones.sh. Elscriptpermitiralusuariointroducirnombresdeficherosportecladohastaquesemetauno vaco;paracadafichero,mostrar elnmerodepalabrasquecomienzanconAutilizandola funcinimplementadaanteriormente.
121