Está en la página 1de 141

ALGUNOS CONCEPTOS BSICOS

Visin panormica Variables de entorno Directorios Comandos El Ncleo del sistema (kernel) Procesos Test

Visin panormica: En su momento trataremos los temas abordados en este captulo de forma completa En este momento dado !ue partimos de cero se "ace necesario al menos esbo#ar una serie de conceptos !ue son tan elementales !ue dificilmente se puede e$plicar al%o sin "acer referencia a ellos Por otra parte estos conceptos estn interrelacionados de tal forma !ue tampoco se puede abordar nin%uno de ellos en detalle en este momento Por ello nuestro primer ob&eti'o es ofrecer una 'isin panormica del () Por borrosa !ue resulte siempre ser me&or esto !ue empe#ar directamente abordando en detalle los temas *saremos muc"as 'eces de forma indistinta *ni$ + ,inu$ No son cosas e!ui'alentes pero en este curso consideraremos ambas cosas como e!ui'alentes sal'o !ue concretemos detalles especficos de ,inu$ Para nosotros ,inu$ es un () tipo *ni$ + precisamente nos centraremos en los aspectos ms %enerales de estos sistemas operati'os Entre sus caractersticas ms destacables est la de ser un () multitarea + multiusuario *n sistema multitarea es a!uel !ue puede e&ecutar 'arios procesos simultaneamente Para ello se puede usar uno o mas procesadores fsicos En el caso de un solo procesador lo !ue ocurre es !ue el tiempo del procesador se 'a repartiendo para atender los distintos procesos creando la ilusin de !ue todo ocurre simultaneamente *n sistema multiusuario es a!uel !ue est pensado para ser utili#ado por 'arios usuarios simultaneamente En la prctica un sistema multiusuario re!uiere capacidad multitarea En el caso concreto de ,inu$ es adems un () multiplataforma +a !ue puede funcionar en diferentes ar!uitecturas ,os conceptos !ue mencionemos en este curso procuraremos ilustrarlos con e&emplos El comando -ec"o- es un comando !ue 'amos a usar muc"o para practicar Este comando se limita a 'isuali#ar en pantalla todo a!uello !ue se le pasa como ar%umentos Por eso nos resultar mu+ util ,o primero !ue 'amos a practicar + !ue no debe ol'idar es el "ec"o de !ue en *ni$ los fic"eros. comandos etc deben indicarse e$actamente respetando la diferencia entre ma+sculas + minsculas
$ echo hola $ ECHO hola

,a se%unda linea "abr producido un mensa&e de error por!ue no e$iste ni%n comando llamado EC/) con ma+sculas Variables e en!orno: Empe#aremos "ablando de las 'ariables sin profundi#ar a"ora en ello *na 'ariable solo es un elemento !ue tiene un nombre + !ue es capa# de %uardar un 'alor Para definir una 'ariable basta poner su nombre un i%ual + su 'alor ()&o no de&ar espacios)
$ VAR33=valor_de_la_variable_VAR33

En *ni$ las 'ariables del sistema se llaman 'ariables de entorno Para consultar el 'alor de una 'ariable se utili#a el nombre de la 'ariable precedido por -0$ echo $VAR33

Para 'er todas las 'ariables + sus 'alores se utili#a el comando set Para "acer la 'ariable e$portable se usa el comando -e$port- (e puede "acer !ue una 'ariable sea de solo lectura con el comando -readonl+- Este comando sin parmetros mostrar todas las 'ariables !ue son de solo lectura Pruebe estos comandos1
$ set $ readonly $ export

E$isten al%unas 'ariables predefinidas + "a+ tres 'ariables importantes !ue mencionaremos en se%uida + !ue son 0P2T/. 0P(3 + 0P(4 "irec!orios: 2!u tambi5n tenemos !ue "acer un pe!ue6o a'ance sobre la estructura de directorios de *ni$ por!ue si no puede !ue no se entienda lo !ue 'amos a "ablar sobre la 'ariable 0P2T/ En *ni$ la estructura de directorios es en forma de arbol similar a la de 7sdos Dado !ue la estructura de directorios se or%ani#a como las ramas de un arbol para locali#ar un punto cual!uiera "a+ !ue utili#ar cada uno de los directorios !ue conducen a ese punto desde el directorio rai# Nosotros lo llamaremos camino + en *ni$ se le suele llamar pat" (e empie#a en el directorio rai# representado por -8- + se a'an#a por las ramas de ese arbol separando cada identificador por un nue'o caracter -8- De esta forma -8usr8local8bin- indica un lu%ar concreto en el arbol de directorios 9ui#s se pre%unte por!u5 *ni$ usa -8- en lu%ar de -:- como en 7sdos ;ecuerde !ue 7sdos fu5 posterior a *ni$ + !ue a <ill =ates le %usta in'entar cosas totalmente nue'as + re'olucionarias 2un!ue el astuto lector +a se "abr dado cuenta. ad'ierto a los despistados !ue esto+ ironi#ando 2pro'ec"ando !ue estamos "ablando de directorios mencionaremos !ue "a+ directorios con si%nificado especial Est el directorio rai# -8- !ue +a "emos mencionado Est el directorio -"ome!ue es el punto donde el sistema nos situa para traba&ar cuando entramos en 5l ;ecordemos !ue en *ni$ normalemente no disponemos de todo el sistema para nosotrso solos ,ue%o podemos cambiar de directorio de traba&o El directorio de traba&o actual se representa como directorio - -. El directorio anterior o directorio padre de este directorio se representa por - - ,os comandos -cd-. -mkdir- + -p>dsir'en para cambiar de directorio actual. crear un directorio + a'eri%uar en !ue directorio nos encontramos actualmente Estamos dando ideas en forma intuiti'a En realidad cuando di%o ? en !ue directorio nos encontramos actualmente ? es una forma de e$presarse Normalmente el usuario no estar en un directorio sino sentado en una silla sentado delante de una pantalla. pero la s"ell mantiene en todo momento al%n directorio abierto como directorio de traba&o actual Coman os *n comando es %eneralmente un fic"ero e&ecutable locali#ado en al%una parte de nuestro sistema E$iste una 'ariable llamada 0P2T/ !ue contiene una lista de caminos de bus!ueda para los comandos todos ellos separados por -1- Compruebe el 'alor de su 'ariable 0P2T/ 0 ec"o 0P2T/ (i un comando no est locali#ado en nin%uno de esos caminos deber ser referenciado indicando el camino completo +a !ue de otra forma no podr ser referenciado (i !uiere saber donde se encuentra un e&ecutable use el comando >"ic" Este comando buscar en los caminos contenidos en la 'ariable 0P2T/ "asta !ue encuentre el comando + entonces mostrar el camino completo !ue conduce al comando Puede ocurrir !ue un comando se encuentre duplicado + !ue los dos sitios donde se encuentre fi%uren en el 0P2T/ En ese caso se e&ecutar el comando !ue se encuentre en el primer camino referenciado en el 0P2T/ @%ualmente el comando >"ic" solo mostrar el primer camino referenciado en el 0P2T/ Estamos usando un comando llamado ec"o para mostrar 'alores Vamos a locali#arlo

0 >"ic" ec"o Ec"o esta situado en uno de los caminos contenidos en 0P2T/ En resumidas cuentas 0P2T/ es una 'ariable !ue usa el interprete de comandos para locali#ar los comando En la leccin si%uiente "ablaremos de -man- Es un comando !ue sir'e para consultar el manual en linea de ,inu$ Pues bien e$iste una 'ariable llamada 072NP2T/ !ue contiene la lista de los caminos donde el comando -man- debe buscar las p%inas del manual ,a 'ariable 072NP2T/ ser usada por el comando -man- + !ui#as al%n otro ,a 'ariable 0P2T/ ser usada por la s"ell + !ui#as por al%n otro comando como por e&emplo ->"ic"- del cual acabamos de "ablar (omos conscientes de !ue no estamos e$plicando %ran cosa a"ora. pero son conceptos mu+ elementales !ue 'amos a utili#ar antes de e$plicar en profundidad todo el sistema de fic"eros de *ni$ 7s adelante tambi5n "ablaremos ms detenidamente sobre las 'ariables de entorno Estamos dando unos pe!ue6os esbo#os sobre al%unas cuestiones por!ue "a+ muc"a interrelacin de unos conceptos con otros + resulta imposible abordar nada en profundidad al principio Us#arios ,inu$ es un sistema operati'o multiusuario + eso implica una filosofa de uso mu+ distinta a la del tradicional ordenador personal Cuando un usuario 'a a usar un () Tipo *ni$ lo primero !ue necesita "acer es identificarse para ser autori#ado a abrir una sesin de traba&o Tambi5n es multitar5a + por ello en el mismo instante 'arios procesos pueden estar funcionando + cada uno puede pertenercer a usuarios distintos ,a informacin !ue se %uarda en el disco duro tambi5n puede pertenecer a distintos usuarios + para e'itar !ue todo ello pro'o!ue conflictos e$isten unos atributos de usuario !ue se asocian a los fic"eros a los directorios. a los procesos. etc En funcin de esto "a+ cosas !ue estarn permitidas a ciertos usuarios + a otros no ,os usarios pueden estar or%ani#ados en diferentes %rupos a fin de poder mane&ar permisos a ni'el de %rupo Esto se "ace para simplificar la administracin del sistema ,os usuarios + los %rupos dentro del sistema se mane&an como un nmero llamado *@D + =@D respecti'amente ,os nmeros en un ordenador se mane&an con muc"a ms facilidad !ue un literal Por eso el nombre de usuario + el nombre de %rupo se %uardarn solo en un fic"ero &unto al nmero *@D + =@D asociado. pero para el sistema un usuario. un %rupo. un proceso. un fic"ero. + muc"as otras cosas se identifican por una cla'e num5rica Para un ordenador resulta ms sencillo consultar si el proceso ABC perteneciente al usuario 3DB tiene permiso de escritura en el fic"ero AEFCA !ue consultar si el usuario -pepito- perteneciente al %rupo -alumnos- tiene permiso de escritura en el fic"ero -8"ome8pepito8leccionDDB t$t- Cuando el ordenador tiene !ue mostrar informacin en formato inteli%ible buscar la descripcin correspondiente a cada cla'e num5rica Cada cla'e recibe un nombre como por e&emplo los *@D. =@D !ue +a "emos comentado otra sera por e&emplo el P@D. para procesos + e$isten otras muc"as ms !ue iremos aprendiendo + !ue forman parte de la &er%a de este () Para 'er los datos de identificacin relati'os a su usuario pruebe lo si%uiente1
$ id

El comando -id Gun- o el comando ->"oami- muestran su nombre de usuario


$ whoami

E$iste un usuario especial !ue %o#a absolutamente de todos los pri'ile%ios + !ue se llama root (u nmero de usuario es decir su *@D es D El N$cleo el sis!ema %&ernel' El ncleo del sistema llamado tambi5n kernel es el encar%ado de reali#ar la ma+ora de funciones bsicas del sistema + %estiona entre otras cosas la memoria. los fic"eros. los usuarios. las

comunicaciones. los procesos. etc ,a %eston de estas cosas se "acen por medio de un limitado nmero de funciones !ue se denominan llamadas al sistema + !ue pueden ser usadas por los pro%ramas ,os procesos !ue usan una llamada al sistema cambian su modo de e&ecucin 7ientras estn e&ecutando la llamada del ncleo se dice !ue estan en modo ncleo + cuando estn e&ecutando cdi%o !ue no pertenece al ncleo se dice !ue estn en modo usuario (on dos ni'eles de e&ecucin distintos +a !ue el modo ncleo es un modo pri'ile%iado Esto %aranti#a a ni'el de "ard>are !ue nin%n pro%rama de usuario pueda acceder a recursos %enerales del sistema ni interactuar con otros procesos a no ser !ue use las llamadas del ncleo las cuales establecern si tiene o no permiso para "acer ciertas cosas Esto proporciona %ran robuste# de funcionamiento *n pro%rama mal dise6ado no per&udicar &ams al sistema ni a otros procesos Cada proceso tiene su propia #ona de memoria + no puede acceder fuera de ella ni intencionadamente ni accidentalmente Para !ue un pro%rama pudiera tener un efecto destructi'o en el sistema tendra !ue pertenecer a -root- o pertenecer al propio nucleo del sistema + solo el admiministrador -root- puede alterar el dic"o nucleo (i el ordenador aparece un buen da destro#ado a martilla#os tambi5n buscaran la forma de culpar a -rootpara no perder la costumbre Procesos *n proceso a diferencia de un pro%rama es al%o 'i'o es decir al%o !ue est funcionando En un sitema multitarea como este. un pro%rama puede dar lu%ar a 'arios procesos 2 cada proceso le corresponder con un nmero de identificacin llamado P@D !ue le identifica totalmente 2dems de esto se %uarda la informacin de identificacin del usuario propietario Cuando un usuario e&ecuta un comando se arranca el proceso correspondiende del cual %eneralmente permanecer como propietario Es decir el sistema no acepta rdenes annimas (iempre fi%urar un usuario para "acer cada cosa Esto se indica con un nmero *@D para identificar el usuario correspondiente No siempre este *@D se corresponde con el usuario !ue arrancaro el proceso Por ello e$iste adems de un *@D un identificador de usuario efecti'o (E*@D) !ue es el !ue realmente es tenido encuenta por el sistema a la "ora de conceder permiso para "acer ciertas cosas El E*@D de -root- es D 2"ora no importa como pero al%unos comandos de forma bien controlada podran con'ertirnos 'irtualmente en superusuarios "aciendo !ue su E*@D 'al%a D Esto ser'ira por e&emplo para permitir "acer cosas especiales + mu+ concretas nada ms !ue en condiciones normales solo -root- podra "acer No "emos mencionado intencionadamente al%unas cosas (como por e&emplo el %rupo de usuario). por!ue estamos simplificando muc"o intencionadamente para intentar !ue en este momento solo capte una primera idea %eneral (i se siente un poco mareado + confuso rela&ese + acostumbrese a esta sensacin ,os primeros pasos suelen ser los ms complicados Especialmente en *ni$ por!ue no fu5 dise6ado como un sistema intuiti'o

El man#al el sis!ema
man%(') apropos%('

=ereralidades del manual (ecciones del manual Conclusiones Test

Gererali a es el man#al 7an es el manual en linea de todos los sistemas operati'os tipo *ni$ Esta no es la leccin ms atracti'a de este curso pero si !ue es una de las ms necesarias *no de los ob&eti'os del curso es alcan#ar cierto ni'el de autosuficiencia en ,inu$ 7an no es la nica fuente de informacin pero frecuentemente suele ser el primer sitio donde se suele mirar (i usted "ace una consulta en una lista

de usuarios de internet de ,inu$ sobre un tema !ue podra "aber a'eri%uado por si mismo consultando el manual al%uien le recordar (en tono ms o menos amable dependiendo del da !ue ten%a) !ue esa informacin estaba en el manual (e pueden e$plicar muc"as cosas sobre man pero es imprescindible !ue practi!ue usted Para ello de un rpido primer 'ista#o a la p%ina man relati'a al comando man 7ientras no indi!uemos lo contrario con'iene !ue pruebe todos los comandos !ue se indican a modo de e&emplo (i tiene posibilidad de usar dos sesiones le resultar ms comodo practicar sobre la marc"a Teclee a"ora el comando si%uiente1 0 man man /abr 'isto un documento !ue e$plica el uso de man + !ue tiene una estructura caracterstica de todas las p%inas man ,as p%inas del manual utili#an un formateador de documentos llamado troff Permite especificar el estilo de un documento (7anera en !ue se 'en los ttulos. encabe#ados. parrafos. donde aparecen los nmeros de p%ina. etc Debido a su fle$ibilidad troff resulta bastante dificil de usar nroff + %roff sir'en para lo mismo pero no e$plicaremos sus diferencias Pensamos !ue solo necesitar conocer su e$istencia (i no instala estos pro%ramas no podr usar man en su ordenador )tro e&emplo Para obtener toda la informacin relati'a al comando -ls- "a%a lo si%uiente1 0 man ls Cuando no se conoce e$actamente la palabra !ue se desea buscar se puede buscar por palabra cla'e Para ello usaremos la opcin Gk. + la opcin Gf Esta opcin no est disponible en muc"os sistemas debido a !ue "a+ !ue %enerar referencias + esto consume muc"o espacio en disco El administrador puede %enerar las referencias usando el comando -catmanCuando no conocemos el nombre de un comando + tampoco encontramos nada por palabra cla'e pero sabemos !ue es lo !ue "ace podemos usar el comando -apropos- Compruebelo tecleando los si%uientes comandos1 0 apropos man 0 apropos apropos 0 man apropos (i tiene su sistema ,inu$ correctamente confi%urado para imprimir documentos en formato Post(crip podr imprimir una p%ina del manual "aciendo 0 man Gt man H lpr Secciones el man#al Para indicar en un documento una referencia a una p%ina del manual se suele indicar con el comando se%uido de la seccin entre parentesis El ttulo de esta leccin -man(3)- es un e&emplo Para consultar un comando en una seccin concreta "abra !ue teclear man InumeroJseccionK IcomandoJoJfuncionK Veamos un par de e&emplos con printf(3) + printf(L)

0 man 3 printf 0 man L printf Como "abr podido obser'ar se refieren a cosas distintas En el primer caso printf es un comando + en el se%undo una funcion estandar de C con el mismo nombre (i no se indica la seccin la bs!ueda se lle'a a cabo en todas las secciones de manual disponibles se%n un orden predeterminado. + slo se presenta la primera p%ina encontrada. incluso si esa p%ina se encuentra en 'arias secciones Por el contrario usando la opcin Ga presentar. secuencialmente. todas las p%inas disponibles en el manual Compruebe esto con los si%uientes e&emplos1 0 man printf 0 man Ga printf Consute las secciones !ue estn disponibles en su sistema en man%(' 2cabamos de indicar lo !ue si%nifica man(3) as !ue el astuto lector +a debera estar mirando en la seccin 3 del manual Concl#siones Para finali#ar tambi5n mencionaremos otra fuente importante de consulta en ,inu$ !ue son los /)MT)s + los N29s Estos son documentos !ue e$plican como "acer al%o o las pre%untas ms frecuentes relati'as a un determinado tema Este tipo de documentos monotemticos son frecuentes en ,inu$ Proceden de contribuciones desinteresadas de usuarios bien informados + estn disponibles en distintos formatos (/T7, te$to plano. etc) (uelen ser ms didcticos !ue las p%inas del man pero man es la referencia obli%ada para cada comando + cada funcin importante Nos e'ita tener !ue recordar todas las opciones de cada comando +a !ue frecuentemente cada comando tiene un amplio &ue%o de opciones /a+ al%unos documentos en espa6ol especialmente adecuados para no'atos Puede locali#ar estos documentos en el rincn del no'ato /emos 'isto unas pocas opciones del comando man @ntente utili#ar al%unas otras opciones Es importante !ue se familiarice con 5l ,as p%inas man no estn pensadas para ense6ar. pero cada 'e# !ue ten%a una duda de como se utili#a al%o tendr !ue recurrir a ellas como primera fuente de informacin Con esto pretendemos !ue abandone usted al%unas de sus 'ie&as costumbres 2ntes usted pensaba de la si%uiente manera1 (i funciona aceptablemente para !ue tocarlo (i no funciona apa%amos + 'ol'emos a encender (i nada de esto sir'e llamamos a un ami%o 2"ora +a sabe !ue tambi5n puede optar por una lectura del manual /a%alo pero consulte de momento solo la informacin relati'a a los nmeros de seccin. partes de un manual. + las opciones Ga. Gk. Gt 2sumimos !ue no es necesario la lectura en profundidad por!ue "abr cosas !ue aun no puede interpretar Ten%a en cuenta !ue partimos de un ni'el cero 2n no sabe usted lo !ue si%nifican al%unas cosas Por eso una 'e# finali#ado el curso con'endr !ue 'uel'a a mirar esta p%ina man relati'a al comando man para sacarle ms pro'ec"o

LA S*ELL
s+%(' &s+%(' cs+%(' bas+%('

@ntroduccin a la s"ell de *ni$ Estructura de la lnea de orden

E$pansin de la lnea de ordenes ;edireccin de entrada salida )perador %ra'e Caracteres de escape ;esumen Test

In!ro #ccin a la s+ell e Uni, E$isten 'arias s"ells para *ni$. OornG("ell (ks"). <ourneG("ell (s"). CG("ell (cs"). + muc"as ms E$isten al%unas para propsitos especiales Por e&emplo la remoteG("ell (rs") se utili#a para e&ecutar comandos en un ordenador remoto ,a (ecure ("ell ((s") se utili#a para establecer una cone$ion se%ura con un ordenador remoto ,a ms utili#ada en ,inu$ es la <ourneG2%ain (/ell (bas") Nosotros de momento 'amos a tratar principalmente la <ourne ("ell !ue es la ms estndar ,a OornG("ell + la <as" son distintos supercon&untos distintos de la <ourneG("ell + por ello todo lo !ue se di%a para la <urneG("ell ser 'lido tambi5n para la OornG("ell + para la <as" En ,inu$ se suele usar la <ourneG2%ain (/ell (bas"). como sustituta de la <ourneG("ell (s") Puntualmente tambi5n e$plicaremos al%una peculiaridad de la bas" Para saber !ue s"ell est usando usted "a%a lo si%uiente1 0 ps H %rep 00 (i aparece Gbas" o Gs" puede continuar sin problemas +a !ue est usando una s"ell adecuada para practicar lo !ue 'iene a continuacin En caso contrario tecle el comando -s"- o el comando -bas"antes de continuar Vuel'a a reali#ar la comprobacin anterior + 'er !ue a"ora esta usando otra s"ell En cual!uier caso cual!uier ("ell es un pro%rama normal + corriente. pero incorpora muc"os de los conceptos ms prcticos de *ni$ No tiene nada de particular !ue al%unos sistemas incorporen al%unas ("ells distintas *na ("ell no es solo un interprete de comandos *na ("ell es sobre todo un interprete de un potente len%ua&e Es!r#c!#ra e la linea e or en (abe usted lo !ue es un introductor P (en in%les lo llaman prompt) Pues es a!uello !ue el interprete de comandos muestra para indicar !ue est esperando a !ue se introdu#ca una orden En *ni$ el introductor de la orden de comandos no es siempre el mismo Por defecto suele 'enir confi%urado distintos introductores para distintos interpretes de comandos + tambi5n se usa un introductor distinto para el usuario root (in embar%o el introductor puede ser 'ariado +a !ue es almacenado en una 'ariable del sistema En realidad la s"ell utili#a dos introductores distintos Para 'er cuales est utili#ando a"ora teclee lo si%uiente1 0 ec"o ?@ntroductor 3Q0P(3? 0 ec"o ?@ntroductor 4Q0P(4? Cuando aparece el primer introductor del sistema 0P(3 indica !ue la s"ell est esperando la introduccin de una orden ,as ordenes se terminan mediante (i despu5s de pulsar la s"ell no considera !ue el comando este completo !uedar esperando ms entrada mostrando el se%undo introductor 0P(4 (i al%una 'e# no es capa# de terminar la introduccin de un comando pruebe a abortar usando ICtrlGCK *na orden constar de un nmero 'ariable de elementos separados por blancos. o por ItabK

En una orden se pueden distin%uir comandos. opciones. ar%umentos. metaGcaracteres. comentarios. comandos internos etc ,os blancos se usan para separar las opciones + ar%umentos presentes en una linea de ordenes + usados de esta forma (como separadores) una secuencia de blancos tiene el mismo efecto !ue uno solo ()&o en *ni$ las ma+sculas + minsculas son si%nificati'as ) 2 continuacin se menciona de forma no e$austi'a los elementos del len%ua&e s"ellGscript No intentamos !ue se aprenda todos estos elementos ni 'amos a comentar a"ora todos ellos <astar !ue se "a%a una idea de !ue tipos de elementos pueden inter'enir

Coman os: (on fic"eros e&ecutables Para !ue la s"ell localice el comando deber estar en un subdirectorio !ue forme parte de la 'ariable P2T/ o de lo contrario debe especificarse el camino completo Opciones: =eneralmente las opciones de un comando son letras precedidas de un si%no -G- En al%unos comandos se pueden poner 'arias opciones como 'arias letras se%uidas precedidas del si%no -G- 2l%unas opciones pueden 'enir como -GGIopcionK- + concretamente en ,inu$ es mu+ frecuente poder usar las opciones GG"elp + GG'ersion en casi todos los comandos Precisamente con la opcin GG"elp obtendremos %eneralmente la lista de opciones disponibles para un comando Tambi5n es frecuente el uso de opciones precedidas por -REn al%unos comandos el orden de las opciones es mu+ si%nificati'o No merece la pena "ablar ms de esto a"ora por!ue 'amos a usar un montn de comandos con un montn de opciones en este curso + tendremos ocasin de practicar muc"o con ellas -e!a.carac!eres : Tienen un si%nificado especial para la s"ell + son uno de los si%uientes caracteres1 S T ( ) H K K IespacioK ItabK Opera ores e con!rol: HH T TT S SS ( ) H Inue'aGlineaK ar/#men!os: (on literales tomados como parmetros de entrada para al%n comando comen!arios: Todo lo !ue si%ue al carcter -U- "asta Inue'aGlineaK ser un comentario Palbras reser0a as: (on palabras reser'adas para implementar el len%ua&e s"ellGscript (on palabras reser'adas1 case. do. done. elif. else. esac. fi. for. function. if. in. select. t"en. until. >"ile. time Coman os in!ernos: Comandos !ue estn implementados dentro de la propia s"ell No necesitan P2T/ E&emplos de comandos internos son1 cd. e$ec. ar%. e'al. e$it.

Para una referencia e$acta + completa debera acudir a la p%ina man bas"(3) aun!ue eso resultara e$cesi'o en este momento Vamos a dar una serie de e&emplos para !ue los practi!ue en su ordenador No es necesario !ue introdu#ca los comentarios

0 U )rden con un nico comando sin opciones ni ar%umentos 0 ls 0 U )rden sin ociones pero con tres ar%umentos 0 ls 8 0 U )rden con un comando + una opcin 0 ls Gl 0 U )rden con un comando + tres opciones indicada de 'arias formas 0 U distintas pero e!ui'alentes entre si 0 ls Gtrl 0 ls Grtl 0 ls Gltr 0 ls Gl Gt Gr 0 ls Gl Gt Gr 0 ls Glt Gr 0 ls Gl Gtr 0 U )pciones !ue empie#an con -GG0 ls GG"elp 0 ls GG'ersion 0 ls GGcolorQauto 0 U E&emplo de opciones + ar%umentos sensibles al orden 0 date Gd no> G; 0 date Gd G; no> 0 U e&emplo de opcion !ue empie#a por -R0 date R-Va Vb Ve V/1V71V( VW VXE,pansin e la linea e or en: E$iste un detalle mu+ importante en el funcionamiento de la s"ell *na cosa es lo !ue nosotros escribimos + otra lo !ue la s"ell ordena !ue se e&ecute 2ntes de !ue la s"ell e&ecute comando al%uno e$pande la linea de ordenes Es decir esa linea se transforma en otra linea ms lar%a ,a orden resultante puede ser mu+ lar%a + tener muc"os ar%umentos Por e&emplo un -Y- ser sustituido por la lista de fic"eros !ue se encuentren en el directorio actual 9ui#as al%uien encuentre !ue e$iste un parecido con el uso de -Y Y- en 7sdos por e&emplo pero el parecido es mu+ superficial + en%a6oso Cuando en *ni$ "acemos -ls Y- el intreprete de comandos e$pande el asterisco + el comando ls recibe una lista de fic"eros !ue tiene !ue listar En 7sdos cuando "acemos -dir Y Y- el interprete de comandos no e$pande nada El comando dir recibe como ar%umento no la lista de fic"eros !ue tiene !ue listar sino un -Y Y- + ser el propio comando dir !uien ten%a !ue e$pandir el ar%umento para obtener la lista de fic"eros !ue tiene !ue listar Por lo tanto la e$pansin en *ni$ est centrali#ada en el interprete de comandos el cual permite "acer e$pansiones muc"o ms potentes !ue en 7sdos *n comando no es ms !ue un e&ecutable + los e&ecutables %eneralmente admiten ar%umentos En *ni$ los comandos toman los ar%umentos !ue les pasa la s"ell despu5s de la e$pansin El -Y- se e$pande en base a los nombres de fic"eros presentes en nuestro directorio actual. sustitu+5ndose por una cadena de caracteres cual!uiera !ue no empie#e por un punto Vamos a reali#ar una prctica completa 2l%unos de los comandos !ue 'amos a usar como -cd-. -mkdir-. -touc"- + otros son comandos !ue no e$plicamos en este momento pero !ue ser'irn para situarnos en un directorio de traba&o + crear al%unos fic"eros para la prctica

,as lineas !ue empiecen con ,as lineas en amarillo

0 comando salida del comando

son comandos !ue debe introducir sal'o !ue se trate de un comentario son la salida obtenida

Esto no !uiere decir !ue siempre !ue pon%amos un comando 'a+amos a poner a continuacin su salida en amarillo pero si la ponemos es para !ue compruebe lo !ue debe obtener 2"ora introdu#ca los comandos !ue indicamos a continuacin + compruebe la salida obtenida 0 cd 8tmp 0 mkdir pruebas 0 cd pruebas 0 U Xa "emos creado un directorio de pruebas + +a estamos dentro de 5l 0 U Para comprobarlo "acemos 0 p>d 8tmp8pruebas 0 U 2"ora creamos unos fic"eros para practicar 0 touc" kk3 kk4 kkkk kk t$t kk doc &4 t$t kk 0 ec"o Y kk3 kk4 kkkk kk t$t kk doc &4 t$t 0 ec"o kY kk3 kk4 kkkk kk t$t kk do$ 0 ec"o Y$t kk t$t &4 t$t 0 ec"o Y 0 ec"o Y kk 0 ec"o Y Y kk t$t kk doc &4 t$t Ni&ese !ue los resultados dependen de los fic"eros e$istentes en el directorio actual ,os mismos comandos reali#ados desde otro directorio distinto daran otro resultado 7anten%a la sesin de la prctica en este punto por!ue continuaremos "aciendo al%unas prcticas ms desde este mismo punto El -P- se e$pande como un nico carcter + tampoco e$pande un punto en el comien#o del nombre del fic"ero @ntrodu#ca a"ora los si%uientes comandos + compruebe la salida obtenida 0 ec"o PPP kk3 kk4 0 ec"o kkP kk3 kk4 2 continuacin no teclee nada +a !ue el resultado es solo una "ipotesis (upon%amos !ue obtenemos un error de este tipo 0 ls Y ks"1 8bin8ls1 ar% list too lon% Esto si%nifica !ue el -Y- se e$pande en un nmero demasiado %rande de fic"eros + eso resulta un

problema para el interprete de comandos ,a forma de obtener la lista de fic"eros sera "aciendo 0 ls o tambi5n 0 ls (i !uisieramos a'eri%uar el nmero de fic"eros podramos contarlos con ->c- 2!ui estamos usando un -H- !ue aun no "emos e$plicado pero !ue lo e$plicaremos en el pr$imo captulo de redireccin de entrada salida 0 ls H >c Gl Pec#liari a es e e,pansin en la bas+ e Lin#, (olo 'amos a mencionar unas cuantas + remitimos al lector a la p%ina del manual de bas" para ms informacion

E$pansin de corc"etes Este es un tipo de e$pansin !ue no tiene para nada en cuenta los fic"eros e$istentes en el directorio actual 0 ec"o aZd.c.b[e ade ace abe

E$pansin de la tilde Esta es una caracterstica especial de la s"ell de ,inu$ !ue resulta realmente util E$pande la tilde como directorio "ome 0 ec"o \ 0 ec"o \root 0 ec"o \root8Y

2rit"metic E$pansion Esto permite e$pandir e$presiones 0((e$pression)) 0 ec"o 0(((AR33)8L)) B

En bas"(3) en el apartado de E]P2N(@)N se mencionan ms cosas 1e ireccin e en!ra a sali a: Normalmente los proceso utili#an para entrada + salida de datos unos dispositi'os estandar (on entrada estandar. salida estandar + salida estandar de errores =eneralmente se utili#a como entrada estandar la entrada de teclado + como salida estandar + salida estandar de errores la pantalla ,a salida estandar se usa como salida normal de datos + la salida estandar de errores se usa para sacar mensa&es !ue indican al%n error. aun!ue tambi5n se usa simplemente como flu&o alternati'o en caso de !ue no resulte deseable su me#cla con otros datos !ue deben salir por salida estandar (e puede alterar flu&o de datos !ue 'a desde un disposito'o estandar a un pro%rama o 'ice'ersa puede ser rediri%ido a otro dispositi'o. o a otro pro%rama. o fic"ero. etc Desde la s"ell se puede "acer esto de 'arias formas

K ;ediri%e la salida estndar a un fic"ero o dispositi'o I ;ediri%e la entrada estndar tomndola desde un fic"ero

H Comunica dos procesos por medio de entrada salida )&o no confundir con 7sdos En *ni$ los procesos comunican directamente pasndose los datos directamente sin crear nin%n fic"ero temporal El proceso !ue lee !uedara en espera mientras el el proceso !ue escribe manten%a abierto el dispositi'o de salida estndar incluso si momentneamente no se produce salida Cuando el proceso escritor termina cierra todos sus fic"eros + el proceso lector acusar la condicin como un fin de datos de entrada KK ;ediri%e la salida estndar a un fic"ero sin sobreescribirlo En lu%ar de ello a6ade al final del mismo IIN@N ;ediri%e entrada estndar desde la propia linea de ordenes (En lu%ar de N@N se puede usar cual!uier literal) 4K ;ediri%e la salida estndar de errores a un fic"ero o dispositi'o 4KT3 ;ediri%e la salida estandard de errores donde esta rediri%ido la salida estandard (DQentrada estandar. 3Qsalida estndar. 4Qsalida de errores estndar)

E2emplos ,a orden si%uiente no produce nin%n resultado 'isible por!ue la salida estndar se rediri%e al dispositi'o 8de'8null Este dispositi'o es como un po#o sin fondo 2 diferencia de una papelera de Mindo>s no se puede recuperar lue%o nada 0 date K 8 de'8null 2"ora un e&emplo curioso El comando -time- sir'e para medir consumos de tiempos de otros comandos + para e'itar me#clas de datos en salida estandar se decidi !ue la salida normal de time fuera la salida estandar de errores 0 time >"oami K 8 de'8null Podemos 'er el consumo de tiempo del comando ->"oami- por!ue este sale por la salida estandar de errores Es un e&emplo de utili#acin de la salida estandar de errores para sacar informacin !ue no tiene nada !ue 'er con nin%n error (in embar%o time es un comando interno + por ello lo si%uiente no funcionara como usted piensa 0 time >"oami 4K 8 de'8null En este caso la redireccin afecta solo al comando >"oami ,os comandos internos son parte de la s"ell + para rediri%ir su salida "abra !ue rediri%ir la salida completa de la s"ell De&aremos esto para un captulo posterior 2ntes de continuar 'amos a ase%urarnos !ue estamos en un sitio se%uro para traba&ar

0 cd 8tmp 0 mkdir pruebas K 8de'8null 0 cd pruebas 0 U Para comprobar !ue estamos en -8tmp8pruebas"acemos 0 p>d 8tmp8pruebas El contenido de -8tmp- suele ser 'aciado cuando rearranca la m!uina o !ui#as en al%n otro momento Contiene informacin temporal /emos usado 8de'8null para i%norar la salida de errores del comando mkdir (i +a e$ista -8tmp8pruebas- mkdir "abra dado un error pero nosotros lo i%noramos por!ue solo nos intersa !ue lo cree en caso de !ue no e$ista + en caso contrario da i%ual El dispositi'o -8de'8null- tambi5n resulta til para simular una entrada nula de datos Por e&emplo para crear un fic"ero 'aci (i +a estamos situados en -8tmp8pruebas- pruebe lo si%uiente1 0 cat I 8de'8null K kk 0 ls Gl kk El mismo efecto podramos conse%uir usando 0 K kk 0 ls Gl kk Esto se puede utili#ar para 'aciar fic"eros respetando los permisos ori%inales Vamos mirar el contenido del directorio rai# 0 ls Gl 2"ora !ueremos repetir el comando pero %uardando el resultado en el fic"ero kk 0 ls Gl 8 K kk No 'emos nada por!ue toda la salida 'a a parar al fic"ero Para 'isuali#ar el contenido de un fic"ero usaremos el comando -cat0 U 7ostrar el contenido del fic"ero kk 0 cat kk 0 U E!ui'ale al anterior 0 cat I kk 0 U Parecido a los dos anteriores 8de'8tt+ es un dispositi'o !ue 0 U se identifica como nuestro terminal 0 cat I kk K 8de'8tt+ Tambi5n podemos 'isuali#ar la salida de un comando a la 'e# !ue %uardamos la salida en un fic"ero El comando tee actua como un bifurcacin 0 ls Gl 8 H tee kk3 0 cat kk3 ;ecuerde !ue lo !ue si%ue a un -H- "a de ser siempre un e&ecutable

0 touc" kk 0 date H kk Esto "abr dado un error Probemos a"ora a rediri%ir la salida estandar de errores a un fic"ero + la salida estandar a otro ( touc" kk 0 date H kk 4K errores K salida 0 cat errores 0 cat salida E$iste un comando -+es- !ue sir'e para %enerar continuamente respuestas afirmati'as en forma de caracteres -+- + finales de linea Este comando est pensado para ser usado con -H- + proporcionar entradas afirmati'as a un comando *saremos el comando -"ead- !ue sir'e para sacar por salida estandar solo una primera parte de los datos de la entrada ,a cantidad datos puede especificarse en nmero de lineas en b+tes. etc Nosotros 'amos a utili#ar b+tes ,a salida de -+es- la entre%aremos a "ead para !ue tome los 3DDD primeros b+tes !ue pasamos al pro%ramas ->c- para !ue cuente lineas palabras + caracteres 0 +es H "ead GGb+tesQ3DDD H >c BDD BDD 3DDD Tubera rota El comando -+es- podra funcionar eternamente (u salida rediri%ida por las buenas a un fic"ero llenara el disco (cosa nada desable por cierto) + acabara dando un error En lu%ar de esto lo "emos rediri%ido a un pro%rama !ue aceptar solo los 3DDD primeros caracteres + lue%o cerrar su entrada pro'ocando un error de Tubera rota ,a s"ell tambi5n permite introducir datos en una forma especial !ue se llama documentoGa!ui Para 'ariar un poco usaremos a"ora el comando -sort- !ue sir'e para ordenar )bser'e !ue en este e&emplo un fin de linea no termina el comando Por ello aparecer el introductor secundario 0P(4 !ue nosotros indicamos con un -K- en amarillo
$ $ $ $ / / / / / / !ara ordenar "nas lineas #"e introd"cimos en la propia linea de ordenes "samos el operador $%%$ se&"ido de "na clave de 'inali(aci)n* de la entrada+ sort %%,-. aaaaa cccccc ((((( bbbb yyyy ,-.

aaaaa bbbb cccccc yyyy (((((

Opera or /ra0e: Cuando colocamos al%o dentro de las comillas %ra'es -^- la s"ell lo interpretara como una cadena cu+o 'alor es sustituido por el resultado de ese comando !ue produce ese comando en salida estndar

0 ec"o date produce GGG ^date^ GGG date produce GGG lun ene 3D 4D1BF134 CET 4DDD GGG El resultado es solo un e&emplo + no puede coincidir e$actamente con el resultado obtenido por usted +a !ue debera poner la fec"a correcta en su sistema 9ui#as el e&emplo !ue acabamos de usar no le de una idea e$acta de la potencia del operador %ra'e ;ecuerde !ue esto ocurre durante la e$pansin de la linea de ordenes antes de e&ecutarse el comando ec"o Por ello podemos "acer cosas como las si%uientes 0 U E&ecutamos date + %uardamos el resultado en un fic"ero cu+o 0 U nombre construimos en base a nuestro nombre de usuario + al 0 U a6o de la fec"a actual 0 date K fic"eroG^>"oami^G^date RVX^ 0 ls Gl fic"eroGY 0 cat fic"eroGY /emos usado un comando para construir el nombre del fic"ero de salida No mostramos los resultados pero confiamos en !ue +a los "a comprobado Carac!eres e escape: Dado !ue la ("ell interpreta catarteres <lancos como separadores 2steriscos e interro%aciones como comodines )perador %ra'e Comillas dobles. Comillas normales. 0. etc (e plantea el problema de !ue "acer cuando !ueremos usar estos caracteres como tales sin !ue sean interpretados por la s"ell E$isten 'arias formas de escapar caracteres para !ue la s"ell no los e$panda. o interprete ,a s"ell no el el nico pro%rama con capacidad de e$pandir e interpretar caracteres especiales Por e&emplo find. e%rep. sed. + otros tambi5n interpretan ciertos caracteres !ue adems pueden coincidir con al%unos de los !ue interpreta la s"ell Para usar caracteres especiales !ue pueden interpretarse por la s"ell "abr !ue escaparlos siempre !ue deseemos !ue lle%uen al comando Vamos a 'er tres formas distintas de escapar caracteres1

Cuando usamos las dobles comillas. los comodines asterisco. interro%acin + caracteres en blanco no se interpretan. aun!ue si se interpretan -0-. comillas %ra'es -^-. + otros Cuando usamos comillas simples se respeta todo el contenido de la cadena sin e$pandir nada Cuando usamos el carcter -:- escapamos el carcter !ue 'a inmediatamente despu5s Cuando es un carcter !ue tiene un si%nificado especial para la s"ell. de&ar de tener ese si%nificado especial

Vamos a 'er todo esto con unos e&emplos1

0 U ,a orden si%uiente muestra el mismo literal !ue el entre comillas 0 ec"o ?Y Y P Y? 0 U En este caso la s"ell interpreta ^p>d^ + 0P2T/. en cambio -Y+ 0 U -P- no se interpretan 0 ec"o ?Y P ^p>d^ 0P2T/? 0 U En este caso se conser'a todo el literal sin interpretar 0 ec"o -Y P ^p>d^ 0P2T/0 U 2 continuacin la orden mostrar dos comillas dobles 0 ec"o :?:? 0 U El caracter Inue'aGlineaK tambi5n puede ser escapado + en este 0 U caso puede ser'ir para introducir comandos mu+ lar%os de forma 0 U ms le%ible Para "acer esta prueba deber pulsar la tecla de 0 U Inue'aGlineaK &usto a continuacin del caratcter -:0 ls Gl 8 H : 0 "ead Gn 3D H : 0 tee 8tmp8resultado H : 0 >c E2ercicio: ,as si%uientes ordenes producen resultados cu+a e$plicacin no resulta tri'ial Esto es debido a !ue permitmos con la opcin Ge !ue el comando -ec"o- interprete caracteres Por lo tanto lo !ue ocurre es !ue primero el interprete de comandos interpreta los caracteres de la linea de rdenes + lue%o el comando ec"o interpreta los caracteres recibidos Consulte la p%ina man de ec"o(3) + bus!ue la opcin Ge E&ecute los comandos !ue le proponemos a continuacin e intente e$plicar los resultados Puede !ue necesite papel + lapi# 0 ec"o Ge :n n 0 ec"o Ge ::n 0 ec"o Ge :::n 0 ec"o Ge ::::n :n 0 ec"o Ge :::::n :n 0 ec"o Ge ::::::n : 0 ec"o Ge :::::::n : 0 ec"o Ge ::::::::n ::n 1es#men /emos 'isto muc"as cosas !ue nos permiten "acernos idea de la potencia de la <ourneG("ell de *ni$ ,a bas" de ,inu$ es un supercon&unto Es decir es compatible pero ms potente 9ueremos resaltar !ue para las personas !ue "an conse%uido terminar este captulo +a se "a

conse%uido al%o importante Personas acostumbradas al usos de 7sdos cometen barbaridades !ue lue%o ni si!uiera son capaces de e$plicar ,a cla'e muc"as 'eces est en la e$pansin de la linea de ordenes En realidad este tema no est a%otado ni muc"o menos + lo completaremos en captulos posteriores aun!ue intercalaremos material ms li%ero por!ue no deseamos "acerle sufrir demasiado (olo lo &usto + por ello creo !ue es el momento de confesar !ue e$ista un truco para reali#ar ms facilmente el e&ercicio anterior aun!ue no lo mencionamos antes por!ue "abra resultado demasiado fcil + cmodo (e trata de acti'ar la tra#a de la s"ell con -set G$- De esta forma podemos 'er el resultado de la e$pansin de linea de rdenes precedida por el si%no -R0 set G$ R set G$ 0 ec"o Ge ::::::::n R ec"o Ge -::::n::n 0 set R$ R set R$ Puede utili#ar este truco cuando no sepa !ue est ocurriendo con la e$pansin de una linea de ordenes !ue no funciona como usted pensaba

INT1O"UCCION A LOS P1OCESOS


9ue es un proceso P@D + PP@D El proceso init *@D + E*@D Como se crea un nue'o proceso ,a llamada al sistema e$ec() ,a llamada al sistema fork() Test

3#e es #n proceso 2 estas alturas ms de uno empe#ar a pre%untarse si realmente es necesario conocer todos estos detalles para un simple uso de un () Este curso esta orientado al uso de ,inu$ desde la consola + resulta necesario conocer estas cosas incluso para un usuario normalito No 'amos a describir detalladamente como estn implementados los procesos en ,inu$ 9ui#as para un curso de pro%ramacin a'an#ada si fuera necesario. pero lo !ue nosotros 'amos a describir es unicamente los detalles ms importantes desde un punto de 'ista didctico + prctico para un usuario normal En un sistema multitarea todo funciona con procesos as !ue conocer unos cuantos principios bsicos sobre procesos le resultar de la m$ima utilidad En un sistema monotarea se usa frecuentemente el t5rmino pro%rama indistintamente para "ablar de un pro%rama en papel. en cdrom. en disco duro o en funcionamiento En un sistema multitarea no se debe usar el t5rmino pro%rama para "ablar de la e&ecucin del mismo En su lu%ar "ablaremos de proceso indicando con ello !ue esta arrancado + funcionando *n pro%rama puede dar lu%ar a 'arios procesos Por e&emplo en un mismo instante 'arios usuarios pueden estar usando un mismo editor *n proceso puede estar detenido pero a diferencia de un pro%rama e$iste una informacon de estado asociada al proceso *n pro%rama es al%o totalmente muerto *n proceso detenido es ms bien como si estu'iera dormido

,os procesos tienen or%ani#ada la memoria de una forma especial mu+ eficiente Por e&emplo la prte de cdi%o del proceso es una parte de solo lectura + puede ser compartida por 'arios procesos a la 'e# @ma%inemos !ue "a+ 'arios usuarios en el sistema usando un mismo editor En ese caso sera un desperdicio tenener la msma informacin de cdi%o de ese pro%rama repetida 'arias 'eces en memoria + ocupando un recurso tan 'alioso como es la memoria ;27 En el caso de tener 'arios pro%ramas distintos en e&ecucin tambi5n se suele dar el caso de !ue conten%an prtes comunes de cdi%o pertenecientes a libreras !ue continen %ran cantidad de funciones de propsito %eneral Para "acer un uso eficiente de estas libreras e$isten libreras dinmicas de uso compartido En ,inu$ el uso de estas libreras no est or%ani#ado de una forma unificada para todas las distribuciones por lo cual los e&ecutables binarios pueden ser incompatibles entre distintas distribuciones Este problema se puede solucionar partiendo de los fuentes + recompilando la aplicacin en nuestro sistema Por esta ra#n un binario de ;ed/at. o (use puede no funcionar en (lack>are o en Debian PI" 4 PPI" 2 cada proceso le corresponder un nmero P@D !ue le identifica totalmente Es decir en un mismo momento es imposible !ue e$istan dos procesos con el mismo P@D ,o mismo !ue todos los procesos tienen un atributo P@D !ue es el nmero de proceso !ue lo identifica en el sistema tambien e$iste un atributo llamado PP@D Este nmero se corresponde con el nmero P@D del proceso padre Todos los procesos deben de tener un proceso !ue fi%ure como padre pero entonces !ue ocurre si un padre muere antes !ue al%uno de sus "i&os P En estos casos el proceso -init- del cual "ablaremos en se%uida adoptar a estos procesos para !ue no !ueden "uerfanos El proceso ini! Cuando arranca el sistema se desencadena una secuencia de procesos !ue a %randes ras%os es la si%uiente Primero se car%a el nucleo de ,inu$ (Oernel) de una forma totalmente especial + distinta a otros procesos Dependiendo de los sitemas puede e$istir un proceso con P@DQD planificador. o s>apper En ,inu$ + en casi todos los sistemas tipo *ni$ se%uir un proceso llamado -init- El proceso init tiene P@D Q 3 ,ee un fic"ero llamado inittab donde se relacionan una serie de procesos !ue deben arrancarse para permanecer acti'os todo el rato (demonios) 2l%unos de ellos estn definidos para !ue en caso de morir sean arrancados de nue'o inmediatamente %aranti#ando la e$istencia de ese ser'icio de forma permanente Es decir -init- es un proceso !ue 'a a %enerar nue'os procesos pero esta no es una cualidad especial Es mu+ frecuente !ue un proceso cual!uiera %enere nue'os procesos + cuando esto ocurre se dice !ue %enera procesos "i&os Este no es un curso de administracin pero diremos !ue a init se le puede indicar !ue arran!ue el sistema de diferentes formas. por e&emplo en modo monousuario para mantenimiento Este es un captulo en el cual pueden sur%ir muc"as pre%untas retorcidas tales como. !ue pasa si matamos a init. o !uien es el padre de init. pero no nos interesa responder a esto +a !ue init es un proceso mu+ especial + su padre an ms En cada sistema de tipo *ni$ las respuestas a cosas como estas pueden 'ariar muc"o por!ue a ese ni'el la implementaciones 'aran muc"o Nin%n pro%rama normal necesitar usar ese tipo de informacin 9uedan muc"os detalles interesantes relati'os a temas de administracin ,os curiosos siempre tienen el recurso de mirar la p%ina man de init(E) + de inittab (B) pero nosotros no insistiremos ms en este tema (9ue ali'io 'erdad P) UI" 4 EUI" ,os procesos tienen un E*@D (Efecti' *ser @dentif). + un *@D normalmente ambos coinciden El *@D es el identificador de usuario real !ue coincide con el identificador del usuario !ue arranc el proceso El E*@D es el identificador de usuario efecti'o + se llama as por!ue es el identinficador !ue se tiene en cuenta a la "ora de considerar los permisos !ue lue%o e$plicaremos El *@D es uno de los atributos de un proceso !ue indica por decirlo de al%una manera !uien es el propietario actual de ese proceso + en funcin de ello podr "acer ciertas cosas Por e&emplo si un usuario normal intentara eliminar un proceso del cual no es propietario el sistema no lo permitir

mostrando un mensa&e de error en el !ue ad'ierta !ue usted no es el propietario de ese proceso + por tanto no est autori#ado a "acer esa operacin Por el contrario el usuario root puede "acer lo !ue !uiera con cual!uier proceso +a !ue el sistema no comprueba &ams si root tiene permisos o no para "acer al%o root siempre tiene permisos para todo Esto es cierto a ni'el de llamadas del sistema pero nada impide implementar un comando !ue "a%a comprobaciones de permisos incluso con root 2l%unos comandos en ,inu$ tienen opciones !ue permiten "acer estas cosas + solicitar confirmacin en caso de detectar una operacin peli%rosa o infrecuente El *@D tambi5n es un atributo presente en otros elementos del sistema Por e&emplo los fic"eros + directorios del sistema tienen este atributo De esta forma cuando un proceso intenta efectuar una operacin sobre un fic"ero El kernel comprobar si el E*@D del proceso coincide con el *@D del fic"ero Por e&emplo si se establece !ue determinado fic"ero solo puede ser leido por su propietario el kernel dene%ar todo intento de lectura a un proceso !ue no ten%a un E*@D i%ual al *@D del fic"ero sal'o !ue se trate del todo poderoso root 2un!ue estamos adelantando cosas sobre el sistema de fic"eros 'amos a continuar con un e&emplo Comprobaremos cual es el *@D de su directorio "ome
$ Cambiamos el directorio act"al a home $ cd $ Comprobamos a #"ien pertenece $"id$ y $&"id$ $ ls 0ld + $ Ahora obtenemos el $"id$ y el $&id$ con s"s valores n"m1ricos+ $ ls 0lnd +

(i su directorio "ome est confi%urado de forma l%ica deber pertenecerle a usted (i esto no es as reclame en5r%icamente a su administrador. pero si el administrador resulta ser usted sea ms indul%ente + limitese a corre%irlo + no confiese su error a nadie En realidad casi todo lo !ue !ue se encuentre dentro de su directorio "ome debera pertenecerle a usted *sted debe ser el propietario de su directorio "ome por!ue de otra forma + dependiendo de los permisos asociados a este directorio los procesos !ue usted arran!ue se 'eran o bien incapaces de traba&ar con 5l. o lo !ue es peor cual!uiera podra "acer cual!uier cosa con 5l Como es l%ico "emos mencionado de pasada el tema de permisos de directorios para ilustrar un poco la utilidad del uid pero esto se 'er en detalle en el captulo dedicado al sistema de fic"eros de ,inu$ 2l%unos fic"eros e&ecutables poseen un bit de permisos !ue "ace !ue cambie el E*@D del proceso !ue lo e&ecute con'irtiendose en el *@D del propietario del fic"ero e&ecutado (uena complicado pero no lo es Es decir ima%inemos !ue usted e&ecuta un comando propiedad de root !ue tiene este bit Pues bien en ese momento el E*@D de su proceso pasara a ser el de root =racias a esto un proceso puede tomar temporalmente la identidad de otro usuario Por e&emplo puede tomar temporalmente la identidad de root para ad!uirir pri'ile%ios de superusuario + as acceder por e&emplo a fic"eros del sistema propiedad de root El sistema recibe continuamente peticiones de los procesos + el E*@D del proceso determinar !ue el kernel le conceda permiso para efectuar la operacin deseada o no 7uc"as 'eces sorprende !ue en ,inu$ apenas se cono#can unos pocos casos de 'irus. mientras !ue en otros sistemas parecen estar a la orden del da Es perfectamente posible reali#ar un 'irus !ue infecte un sistema ,inu$ pero de una forma o de otra el administrador tendra !ue darle los pri'ile%ios !ue le con'ierten en peli%roso Por eso no es facil !ue estos 'irus lle%uen mu+ le&os Como se crea #n n#e0o proceso El ncleo del sistema llamado tambi5n kernel es el encar%ado de reali#ar la ma+ora de funciones bsicas !ue %estiona entre otras cosas los procesos ,a %eston de estas cosas se "acen por medio de un limitado nmero de funciones !ue se denominan llamadas al sistema Estas llamadas al sistema estn implementadas en len%ua&e C + "ablaremos a"ora un poco sobre un par de ellas llamadas fork () + e$ec() (i lo%ramos !ue ten%a una 'a%a idea de como funcionan estas dos importantsimas funciones facilitaremos la compresin de muc"as otras cosas ms adelante

La llama a al sis!ema e,ec%' Cuando "ablamos de proceso debe usted pensar solamente en al%o !ue se est e&ecutando + !ue est 'i'o *n proceso puede e'olucionar + cambiar totalmente desde !ue arranca "asta !ue muere ,o nico !ue no cambia en un proceso desde !ue nace "asta !ue se muere es su identificador de proceso P@D *na de las cosas !ue puede "acer un proceso es cambiar por completo su cdi%o Por e&emplo un proceso encar%ado de procesar la entrada + salida de un t5rminal (%ett+) puede transformarse en un proceso de autentificacion de usuario + pass>ord (lo%in) + este a su 'e# puede transformarse en un interprete de comandos (bas") (i la llamada e$ec() falla retornar un G3 Esto no es curso de pro%ramacin as !ue nos da i%ual el 'alor retornado pero lo !ue si nos interesa es saber !ue cuando esta llamada tiene 5$ito no se produce &ams un retorno En realidad no tendra sentido retornar a nin%n lado Cuando un proceso termina simplemente de&a de e$istir En una palabra muere + +a est ,a llamada e$ec() mantiene el mismo P@D + PP@D pero transforma totalmente el cdi%o de un proceso en otro !ue car%ar desde un arc"i'o e&ecutable La llama a al sis!ema 5or&%' ,a forma en !ue un proceso arranca a otro es mediante una llamada al sistema con la funcin fork() ,o normal es !ue el proceso "i&o e&ecute lue%o una llamada al sistema e$ec() fork() duplica un proceso %enerando dos procesos casi id5nticos En realidad solo se diferenciaran en los 'alores P@D + PP@D *n proceso puede pasar al proceso "i&o una serie de 'ariables pero un "i&o no puede pasar nada a su padre a tra'5s de 'ariables 2dems fork() retorna un 'alor num5rico !ue ser G3 en caso de fallo. pero si tiene 5$ito se "abr producido la duplicacin de procesos + retornar un 'alor distinto para el proceso "i&o !ue para el proceso padre 2l proceso "i&o le retornar el 'alor D + al proceso padre le retornar el P@D del proceso "i&o Despu5s de "acer fork() se pueden "acer 'arias cosas pero lo primero !ue se utili#a despes del fork es una pre%unta sobre el 'alor retornado por fork() para as saber si ese proceso es el padre o el "i&o +a !ue cada uno de ellos normalmente deber "acer cosas distintas Es decir la pre%unta sera del tipo si so+ el padre "a%o esto + si so+ el "i&o "a%o esto otro Con frecuencia aun!ue no siempre el "i&o "ace un e$ec() para trasformarse completamente + con frecuencia aun!ue no siempre el padre decide esperar a !ue termine el "i&o Tambi5n normalmente aun!ue no siempre esta parte de la leccin es necesario releerla ms de una 'e# Estamos dando pe!ue6os detalles de pro%ramacin por!ue en estas dos llamadas del sistema son mu+ si%nificati'as (u funcionamiento resulta c"ocante + su comprensin permite e$plicar un montn de cosas

-AS SOB1E P1OCESOS 6 SE7ALES


,as formas de comunicacin entre procesos (ecuencia de arran!ue en una sesin de consola Comando ps Confi%uracin del terminal Comando time Comando kill Comando nice Comando renice Test

Las 5ormas e com#nicacin en!re procesos ,os procesos no tiene una facilidad de acceso indiscriminada a otros procesos El "ec"o de !ue un proceso pueda influir de al%una manera en otro es al%o !ue tiene !ue estar perfectamente controlado por moti'os de se%uridad Comentaremos solo mu+ por encima las diferentes formas de

comunicacin entre procesos 3 2 tra'5s de 'ariables de entorno1 (olo es posible de padres a "i&os 4 7ediante una se6al1 (olo indica !ue al%o "a ocurrido + solo lle'a como informacin de un nmero de se6al L 7ediante entrada salida1 Es la forma ms corriente a ni'el de s"ell Xa "emos comentado el operador pipe -H- !ue conecta dos procesos A 7ediante t5%nicas @PC u otras1 (emforos. 7emoria compartida. Colas de mensa%es B 7ediante sockets1 Este sistema tiene la peculiaridad de !ue permite comunicar procesos !ue est5n funcionando en m!uinas distintas No profundi#amos sobre esto por!ue a"ora no estamos interesados en la pro%ramacin 7s adelente si comentaremos bastante sobre 'ariables + entrada salida por!ue daremos nociones de pro%ramacin en s"ellGscript Tambien daremos a continuacin unos pe!ue6os detalles !ue tienen !ue 'er con el arran!ue del sistema por!ue tambi5n nos resultar util para comprender como funcionan las cosas Sec#encia e arran8#e en #na sesin e consola Para consultar la dependencia &err!uica entre unos procesos + otros e$iste en ,inu$ el utilsimo comando pstree No es esencial + !ui#as no lo ten%a usted instalado pero resulta mu+ prctico (i dispone de 5l pruebe los comandos -pstree-. + -pstree Gp- Nosotros 'amos a mostrar el resultado de ambos comandos en el sistema !ue estamos usando en este momento para !ue en cual!uier caso pueda apreciar el resultado pero le recomendamos !ue lo instale si no dispone de 5l +a !ue resulta mu+ prctico Tambien puede usar como sustituto de -pstree- el comando -ps a$f- pero no espere un resultado tan bonito
$ pstree init020apache000345apache6 70atd 70bash000pstree 70845bash6 70bash000vi 70bash000xinit0209,:;_<3V 7 =0mwm020+xinitrc000xterm000bash 7 =0+xinitrc000xcloc> 70cron 70&etty 70&pm 70inetd 70>'l"shd 70>lo&d 70>piod 70>swapd 70>"pdate 70lpd 70portmap 70postmaster 70sendmail 70sshd 70syslo&d =0x's

Este formato nos da un arbol de procesos abre'iado en el !ue procesos con el mismo nombre + !ue ten%an un mismo padre aparecern de forma abre'iada En el e&emplo anterior aparece -4Y_bas"`-

indicando !ue "a+ dos procesos bas" como "i&os de init. + tambien "a+ al%unos proceso apac"e arrancados El !ue e$istan muc"os procesos arrancados no indica necesariamente un alto consumo de CP* Puede !ue est5n todos ellos "aciendo el 'a%o <ueno en el caso de apac"e !ui#as est5n "aciendo el indio (Esto ltimo es una broma !ue no "e podido e'itar)
$ pstree 0p init?@A020apache?8BCA020apache?8@;A 7 70apache?8@3A 7 70apache?8@:A 7 70apache?8@DA 7 70apache?88BA 7 70apache?@;:BA 7 =0apache?@;:8A 70atd?@D;A 70bash?8@BA000pstree?@33DA 70bash?8@@A 70bash?8@8A000vi?@;DEA 70bash?8@EA000xinit?@;3DA0209,:;_<3V?@;CCA 7 =0mwm?@;C3A020+xinitrc?@;E8A000xterm?@;;BA000bash?@;;@A 7 =0+xinitrc?@;EEA000xcloc>?@;33A 70bash?8@CA 70cron?@DDA 70&etty?8@3A 70&pm?@C3A 70inetd?@3:A 70>'l"shd?8A 70>lo&d?@3@A 70>piod?CA 70>swapd?EA 70>"pdate?3A 70lpd?@E3A 70portmap?@3;A 70postmaster?@;:A 70sendmail?@3DA 70sshd?@:3A 70syslo&d?@8DA =0x's?@:;A

En este otro formato 2parece cada proceso con su P@D Podemos 'er !ue el Proceso -init- tiene pid Q 3 + "a reali#ado 'arios forks() %enerando procesos con pid K 3 En al%unos sistemas la %eneracin de nmeros de P@D para procesos nue'os se reali#a en secuencia En otros resulta un nmero impredecible Entre los procesos %enerados por -init- estn los procesos -%ett+- (e arrancar un -%ett+- por cada terminal Este proceso confi%ura la 'elocidad + otras cosas del terminal. manda un saludo + lue%o se transforma con e$ec el proceso -lo%in- Todos estos procesos se e&ecutan con E*@D + *@D Q D. es decir como procesos del superusuario root Cuando el proceso -lo%in- conoce nuestra identidad despu5s de 'alidar usuario pass>ord se transformar con e$ec en la s"ell especificada e para nuestro usuario el fic"ero 8etc8pass>d Para 'er la linea !ue contiene sus datos pruebe a "acer lo si%uiente1 0 %rep ^>"oami^ 8etc8pass>d ,a linea tiene el si%uiente formato lo%in1contrase6a1*@D1=@D1nombre1dir1int5rprete Vamos a suponer !ue su s"ell por defecto sea la bas" (i esta s"ell arrancara con el E*@D Q D tendramos todos los pri'ile%ios del super usuario pero esto no ocurre as Esta s"ell +a tendr nuestro *@D + nuestro E*@D Vamos a representar todo esto marcando los puntos en los !ue ocurre al%n fork() con un si%no -R5init602'or>?A0/5&etty6

7 2'or>?A0/5&etty60exec?A0/5lo&in60exec?A0/5bash62'or>?A0exec?A0/5comando6 7 2'or>?A0/5&etty6 7

,a s"ell puede arrancar un comando mediante un fork() + lue%o un e$ec() + esperar a !ue este muera ;ecuerde !ue la funcin e$ec() no tiene retorno posible +a !ue finali#a con la muerte del proceso En ese momento la s"ell detecta la muerte de su "i&o + continua su e&ecucin solicitando la entrada de un nue'o comando Cuando introducimos el comando -e$it- estamos indicando a la s"ell !ue finalice + su padre -init- se encar%ar de lan#ar nue'o proceso -%ett+- ,%icamente -e$it- es un comando interno de la s"ell 9ui#as le llame la atencin !ue la muerte de -bas"- termine pro'ocando un nue'o -%ett+- cuando -%ett+- pas a -lo%in- + este a -bas"- pero en esta secuencia %ett+Glo%inGbas" no "a+ nin%n fork() por eso %ett+. lo%in. + bas" son en realidad el mismo proceso en distintos momentos con el mismo P@D obtenido en el fork() reali#ado por -init- solo !ue "a ido cambiando su personalidad manteniendo la misma identidad (mismo P@D) Para -init- siempre se trat del mismo "i&o + la muerte de cual!uiera de ellos (%ett+. lo%in o bas") pro'oca !ue se arran!ue un nue'o -%ett+sobre ese mismo terminal con el fin de !ue ese terminal no !uede sin ser'icio ,a presentacin del mensa&e de ,o%in es mostrada por -%ett+- *na 'e# introducido el identificador de usuario ser -lo%in- !uien muestre la solicitud de introduccin de la pass>ord. + una 'e# introducido el pass>ord ser la s"ell !uien muestre el introductor de comandos pero estamos "ablando siempre del mismo proceso 2 modo de e&ercicio compruebe estas cosas por usted mismo usando al%unos de los comandos !ue +a conoce Para "acer esta prctica no basta con usar un terminal remoto sino !ue necesitar un PC completo para ir "aciendo cosas desde distintas sesiones ,e proponemos "acerlo ms o menos de la si%uiente manera1 3 Entre en cada uno de los terminales disponibles de forma !ue todos los terminales esten ocupados por un interprete de comandos <astar con "acer lo%in en todos ellos 4 ,ue%o compruebe !ue no "a+ nin%n proceso -%ett+L /a%a un e$it desde uno de estos terminales A Compruebe desde otro termina !ue a"ora si e$iste un proceso -%ett+- + anote su pid B @ntrodu#ca el nombre de usuario en ese terminal !ue !ued libre C Compruebe a"ora desde otra sesion !ue e$iste un proceso lo%in con el P@D !ue usted anot a Termine de indentificarse tecleando la pass>ord E Compruebe desde otra sesin !ue a"ora e$iste una s"ell con el P@D !ue anotamos (i no tiene el comando -pstree- tendr !ue usar -ps- pero con pstree puede 'er ms facilmente lo !ue ocurrir a"ora F 2"ora teclee el comando -sleep 444- desde la sesin !ue tiene el P@D anotado por usted 3D Compruebe desde otra sesin !ue el interprete de comandos "a reali#ado un fork() %enerando un comando !ue est e&ecutando el comando indicado (i no "a podido reali#ar el e&ercicio anterior tendr !ue confiar en !ue las cosas son como decimos + +a est Coman o ps 7uestra los procesos acti'os Este comando es mu+ util para saber !ue comandos estn funcionando en un determinado momento (iempre !ue se mencione un comando puede consultar la p%ina man del mismo En el caso de -psse lo recomendamos +a !ue es un comando mu+ util con una %ran cantidad de opciones Nostros mencionaremos al%unos e&emplos pero se aconse&a probar -ps- probando las distintas opciones !ue se mencionan en la p%ina del manual E&emplos1

$ !ara ver todos s"s procesos #"e estFn $ asociados a al&Gn terminal+ $ ps !-H IIJ <IAI I-KE COKKA.H +++++++ $ !ara ver todos s"s procesos y los de otros $ "s"arios siempre asociados a al&Gn terminal+ $ ps a !-H IIJ <IAI I-KE COKKA.H +++++++ $ !ara ver todos s"s procesos est1n asociados o $ no a al&Gn terminal+ $ ps x !-H IIJ <IAI I-KE COKKA.H +++++++ $ !ara ver todos los proceso asociados al $ terminal @ $ ps t@ !-H IIJ <IAI I-KE COKKA.H +++++++ $ !ara ver todos los procesos del sistema+ $ ps ax !-H IIJ <IAI I-KE COKKA.H +++++++

Estos e&emplos !ue acabamos de 'er obtienen un mismo formato de datos E$plicaremos el si%nificado de estos atributos P@D TTX Es el 'alor nmerico !ue idenfica al proceso Es el terminal asociado a ese proceso ,os demonios del sistema no tienen nin%n terminal asociado + en este campo fi%urar un P Tiene tres campos !ue indican el estado del proceso (;.(.D.T.W) (M) (N) ,a ( indica !ue el proceso est suspendido esperando la liberacin de un recurso (CP*. Entrada (alida. etc) necesario para continuar E$plicaremos solo al%unos de estos estados en su momento @ndica el tiempo de CP* !ue lle'a consumido ese proceso desde !ue fu5 arrancado

(T2T

T@7E

C)772ND 7uestra el comando + los ar%umentos !ue le fueron comunicados E$isten muc"as opciones para el comando ps !ue ofrecen un formato distinto ,e recomendamos especialmente !ue pruebe -ps u-. -ps l-. + -ps fEn *ni$ los comandos suelen ser'ir para una sola cosa. aun!ue suelen tener muc"as opciones ,a entrada de los comandos suele tener una estructura simple + la salida de los comandos tamben (i un comando no encuentra nada !ue "acer e$iste la costumbre de !ue termine de modo silencioso

Todo esto permite !ue los comandos puedan combinarse en%anc"ado la salida de uno con la entrada de otro 2l%unos comandos estn especialmente dise6ados para ser usados de esta forma + se les suele denominar filtros ,a salida del comando -ps- se puede filtrar con -%rep- para !ue muestre solo las lneas !ue nos interesan Con5i/#racin el !erminal Con'iene !ue comprobemos si su terminal est correctamente confi%urado para poder interrumpir un proceso Normalmente se usa ICtrlGCK pero esto depende de la confi%uracin de su terminal (i en al%n momento su terminal !ueda desconfi%urado "aciendo cosas raras como por e&emplo mostrar caracteres e$tra6os intente recuperar la situacin tecleando el comando -reset- Esto solo es 'lido para ,inu$ Para otros sistemas puede ser util -stt+ sane- !ue tambi5n funciona en ,inu$ pero no es tan efica# como el comando -reset- Para comprobar la confi%uracin de su terminal puede "acer -stt+ Ga- aun!ue obtendr demasiada informacin !ue no es capa# de interpretar. podemos indicarle !ue se fi&e en el 'alor de -intr- Debera 'enir como -intr Q bC- (i no lo locali#a "a%a -stt+ Ga H %rep intr- De esta forma solo obtendr una linea Para confi%urar el terminal de forma !ue pueda interrumpir procesos con ICtrlGCK puede intentar confi%urar su terminal "aciendo -stt+ bVbC- El carcter ICtrlGVK no se mostrar en el terminal +a !ue actua e'itando !ue el si%uiente carater (ICtrlGCK en nuestro caso) no sea interpretado como caracter de control No pretendemos a"ora e$iplicar los t5rminales de ,inu$ pero si !ueremos !ue compruebe su capacidad para interrumpir procesos con ICtrlGCK +a !ue usaremos esto en las prcticas !ue si%uen *na prueba inofensi'a para comprobar la interrupcion de un proceso es el si%uiente comando !ue pro'oca una espera de un minuto Deber introducir el comando e interrumpirlo antes de !ue el tiempo establecido (CD se%undos se a%ote)
$ sleep ;B %Ctrl0C/

(i no "a conse%uido interrumpir el proceso no si%a adelante para e'itar !ue al%una de las prcticas de&e un proceso demasiado tiempo consumiendo recursos de su m!uina (i esta usted solo en la m!uina eso tampoco tendra muc"a importancia pero es me&or !ue a'eri%ue la forma de interrumpir el proceso del e&emplo anterior Coman o !ime Da los tiempos de e&ecucion Este comando nos da tres 'alores cu+a interpretacion es1
real "ser sys+ Iiempo real &astado ?H"raci)n realA Iiempo C!L de "s"ario+ Iiempo C!L cons"mido como proceso de >ernel+ ?Es decir dentro de las llamadas al >ernelA

,a ma+ora de los comandos estn %ran parte del tiempo sin consumir CP* por!ue necesitan esperar para "acer entrada salida sobre dispositi'os lentos !ue adems pueden estar en uso compartidos por otros procesos E$iste un comando capa# de esperar tiempo sin %astar tiempo de CP* (e trata del comando -sleep- Para usarlo le pasaremos un ar%umento !ue indi!ue el nmero de se%undos de dic"a espera Por e&emplo 'amos a comprobar cuanta CP* consume una espera de C se%undos usando sleep
$ time sleep ; real "ser sys Bm;+B8@s BmB+B8Bs BmB+BBBs

El resultado obtenido puede 'ariar li%eramente en cada sistema pero bsicamente obtendr un tiempo -real- de unos C se%undos + un tiempo de CP* ( -user- R -s+s- ) mu+ pe!ue6o

Vamos a medir tiempos en un comando !ue realice operaciones de entrada salida as como proceso de datos
$ time ls M4 / MdevMn"ll real "ser sys BmB+BDDs BmB+B:Bs BmB+B@Bs

En este comando 'er !ue el consumo total de CP* es superior al del comando sleep En cual!uier caso el tiempo real tardado en la e&ecucin del comando es siempre mu+ superior al consumo de CP* Vamos a probar un comando !ue apenas realice otra cosa !ue entrada salida Vamos a en'iar 3D7b+tes al dispositi'o 8de'8null E$iste un comando -+es- !ue pro'oca la salida continua de un caracter -+- se%uido de un caracter retorno de carro Esta pensado para sustituir la entrada de un comando interacti'o en el cual !ueremos contestar afirmati'amente a todo lo !ue pre%unte Nosotros fitraremos la salida de -+es- con el comando -"ead- para obtener solo los 3D7b+tes primeros producidos por -+es- + los en'iaremos al dispositi'o nulo -8de'8null- !ue 'iene a ser un po#o sin fondo en el cual podemos introducir cual!uier cosa sin !ue se llene. pero no podremos sacar absolutamente nada En una palabra 'amos a pro'ocar proceso de entrada salida perfectamente inutil
$ time yes 7 head 00bytes=@BBBBBBB / MdevMn"ll I"berNa rota real "ser sys Bm;+C3:s BmE+CCBs BmB+DBBs

Podemos "acer un consumo fuerte de CP* si for#amos a clculos masi'os !ue no ten%an apenas entrada salida Por e&emplo podemos poner a calcular el nmero P@ con LDD cifras decimales -bc- es un comando !ue consiste en una calculadora 2dmite uso interacti'o pero tambien acepta !ue le pasemos las operaciones desde otro proceso combinando entrada salida
$ time ? echo Oscale=3BBP C4a?@AO 7 bc 0l A 3+@C@ED8;E3E:D3D383:C;8;C33:383DEB8::C@D3@;D3DD33E@BE:8BD3CDCCED83B3Q :@;CB;8:;8B:DD:;8:B3C:8E3C8@@3B;3D:8@C:B:;E@38:83B;;C3BD3:CC;BDEEBE:Q 883@38E3EDCB:@8:C:@@@3CEB8:C@B83B@D3:E8@@BEEED;CC;88DC:DECD3B3:@D;CCQ 8::@BD3E;;ED33CC;@8:C3E;C:8333:;3:3@;E83@8B@DBD@CE;C:E;;D83C;B3C:;@BQ CEC38;;C:8@33D3;B38;B8CD@C@838 real "ser sys Bm8+E8:s Bm8+E8Bs BmB+B@Bs

En un Pentium 4DD7"# este comando tard L se%undos para LDD cifras + 4D se%undos usando CDD cifras Decimos esto para !ue 'ea !ue el tiempo !ue se tarda aumenta e$ponencialmente + !ue dependiendo de la potencia de su ordenador puede suponer bastante tiempo de proceso 9ui#as ten%a !ue 'ariar el nmero de cifras si%nificati'as para poder medir tiempos con comodidad Este comando -time- es un comando interno pero en ,inu$ tambi5n "a+ un comando e$terno llamado de la misma forma Para poder e&ecutarlo con esta s"ell debera incluir el camino completo No deseamos abusar de su escaso -time- as !ue no lo comentaremos Para buscar en el man el comando -time- !ue "emos e$plicado o de cual!uier otro comando interno tendra !ue mirar en la p%ina del manual de bas"

Coman o &ill Este comando se utili#a para matar procesos En realidad en'ia se6ales a otros procesos. pero la accin por defecto asociada a la ma+oria de las se6ales de uni$ es la de finali#ar el proceso ,a finali#acin de un proceso puede 'enir acompa6ada del 'olcado de la informacin del proceso en disco (e %enera un fic"ero -core- en el directorio actual !ue solo sir'e para !ue los pro%ramadores localicen el fallo !ue pro'oc esta prusca finali#acin del proceso Por e&emplo si el proceso intenta acceder fuera del espacio de memoria concedido por el kernel. recibir una se6al !ue lo matar ,o mismo ocurrir si se produce una di'isin por cero o al%n otro tipo de error irrecuperable *n proceso uni$ puede capturar cual!uier se6al e$cepto la se6al F *na 'e# capturada la se6al se puede acti'ar una rutina !ue puede pro%ramarse con toda libertad para reali#ar cual!uier cosa -kill- por defecto es -kill G3B- en'ia un (@=TE;7 + %eneralmente pro'oca cierre ordenado de los recursos en uso Esta se6al puede ser i%norada. o puede ser utili#ada como un a'iso para terminar ordenadamente Para matar un proceso resulta recomendable en'iar primero un kill G3B + si no se consi%ue nada repetir con kill GF Este ltimo GF en'ia (@=O@,, !ue no puede ser i%norada. + termina inmediatamente (olo fallara si no tenemos permisos para matar ese proceso. pero si es un proceso nuestro. kill GF resulta una opcin se%ura para finali#ar un proceso ,as se6ales actuan frecuentemente como a'isos de !ue "a ocurrido al%o E$isten muc"os tipos de se6ales para poder distin%uir entre distintas cate%oras de incidencias posibles Coman o nice El multiproceso esta implementado concediendo ciclicamente la CP* en roda&as de tiempo a cada proceso !ue esta en e&ecucin E$isten dos numeros de prioridad ,a prioridad N@CE + la prioridad concedida por el Oernel mediante un al%oritmo Esta ltima no tiene por!ue coincidir con nice + puede 'aler mas de LF En cambio el comando nice solo acepta 'alores comprendidos entre D + LF. siendo 4D el 'alor por defecto Cuando nice sube el 'alor si%nifica !ue el proceso tiene ba&a prioridad El comando -nice G3D- incrementara el 'alor nice en 3D (es decir ba&a la prioridad) Para ba&ar el 'alor de nice (Es decir para subir la prioridad) "ace falta permisos de superusuario En un sistema con poca car%a de traba&o no se notar apenas diferencia al e&ecutar un comando con ba&a prioridad o con alta prioridad Pero en un sistema con la CP* sobrecar%ada los comandos e&ecutados con prioridad ms ba&a se 'eran retrasados +a !ue el kernel conceder ms tiempo de CP* a los procesos con prioridad ms alta /a+ otros comandos de inter5s Por e&emplo -top- muestra los procesos !ue mas CP* est5n consumiendo -'mstat- saca informacin del consumo de memoria 'irtual /a+ !ue tener en cuenta !ue el sistema %asta recursos en la %estin de los procesos Por e&emplo si estamos compartiendo una m!uina con otros usuarios + tenemos !ue reali#ar 3B compilaciones importantes terminaremos antes "aciendolas en secuencia una detras de otra !ue lan#andolas todas a la 'e# ,a a'aricia de !uerer usar toda la CP* posible para nosotros puede conducir a una situacin en la cual ni nosotros ni nadie sacar %ran pro'ec"o de la CP* El sistema reali#ar una cantidad enorme de traba&o improducti'o destinado a mantener simultanemente funcionando una %ran cantidad de procesos !ue %astan muc"a CP* + muc"a memoria ,a m!uina comien#a a usar el disco duro para suplir la falta de ;27 + comien#a a %astar casi todo el tiempo en el intercambio de la ;27 con el disco duro 2 esta situacin se la denomina s>apin% Coman o renice (ir'e para cambiar la prioridad de un proceso (i%ue la misma filosofia !ue el comando nice pero "a+ !ue identificar el o los procesos !ue deseamos cambiar su prioridad (e puede cambiar la prioridad de un proceso concreto dado su P@D o los procesos de un usuario dando su *@D o todos los procesos pertenecientes a un determinado %rupo dando su =@D Tanto el comando nice como el comando -renice- tienen ma+or inter5s para un administrador de sistemas !ue para un usuario normal Consulte las p%inas del manual para ms detalles

SISTE-A "E 9IC*E1OS Primera par!e


@ntroduccin Nombres de fic"eros Comandos para mane&ar el sistema de fic"eros 2lias para el uso de los comandos ms frecuentes E&emplos de uso de los comandos estudiados (istema plano de fic"eros Tipos de fic"eros 2tributos de fec"a en fic"eros Test

In!ro #ccin Este es sin duda uno de los captulos con ma+or inter5s prctico 2 menudo la palabra fic"ero se puede usar de dos formas Nic"eros en sentido amplio como cual!uier cosa !ue tiene nombre en un sistema de fic"eros + otra como fic"eros propiamente dic"os !ue ms tarde llamaremos fic"eros re%ulares Estos ltimos son la clase de fic"eros ms normalitos + sir'en para contener informacin le%ible o e&ecutable (e trata de una coincidencia de nombres especialmente lamentable por!ue dificulta mi traba&o de e$plicar a"ora las cosas Por e&emplo cuando "ablamos de %eneralidades para los nombres de fic"eros + cuando "ablemos de tipos de fic"eros estaremos "ablando de fic"eros en sentido amplio. en cambio cuando "ablamos de diri%ir la salida a un fic"ero o cuando decimos !ue leemos un fic"ero nos referimos a fic"eros propiamente dic"os es decir fic"eros re%ulares !ue son los !ue se usan normalmente como contenedores de informacin ,as palabras no siempre si%nifican lo mismo usadas en diferentes conte$tos as !ue nosotros confiaremos en su capacidad de deduccin + usaremos indistintamente la palabra fic"ero para ambas cosas aun!ue reconocemos !ue es una costumbre !ue no facilita las cosas. pero por des%racia 'er este t5rmino utili#ado en diferentes sitios usado para ambas cosas No se preocupe + ten%a paciencia al fin + al cabo si +a "a lle%ado "asta a!u. su sa%acidad a !uedado prcticamente demostrada Comprender todo esto cuando "ablemos de tipos de fic"eros Para poner a prueba una 'e# ms su sa%acidad. (santa paciencia la su+a) usaremos el t5rmino fic"eros en sus dos acepciones para describir una clase de fic"eros llamada directorios ,os directorios pueden considerarse como una clase de fic"eros !ue pueden contener toda clase de -fic"eros- (en sentido %eneral) incluidos nue'os directorios. lo cual "ace !ue la estructura final ten%a estructura similar a la de un arbol ,as ramas de un arbol forman la estructura de todo el arbol + de forma mu+ similar los directorios forman el arma#n de toda la estructura del sistema de fic"eros *n sistema de fic"eros en *ni$ tiene esta estructura de rbol + el punto de ori%en se llama root (ra#) + se caracteri#a por!ue el padre de -root- resulta ser el mismo -root- + se simboli#a por -8Xa sabemos !ue esto es raro pero no pre%unte como al%uien puede ser padre de si mismo Esto sencillamente es un truco para rematar la estructura de todo el rbol de al%una forma )&o el super usuario tambi5n se le llama -root- pero no tiene nada !ue 'er con esto Es solo otra molesta coincidencia Nombres e 5ic+eros *n nombre de fic"ero 'alido para el ncleo de ,inu$ puede contener cual!uier carcter sal'o el caracter -8- + sal'o el carter -:D- (caracter nulo) (in embar%o no es prudente usar caracteres especiales

interpretados por la s"ell (0.?.-.T.U.(.).Y._.`.Z.[. etc ) Tampoco debe empe#ar por el carcter -G- !ue puede ser confundido con una opcin Por e&emplo si llamamos a un fic"ero -Gr- no solo no podremos borrarlo sino !ue se puede confundir con la peli%rossima opcin -Gr- de borrado recursi'o Cuando un usuario es dado de alta se define la s"ell por defecto !ue usar + el directorio de entrada Este directorio de entrada al sistema ser el 'alor de la 'ariable 0/)7E En cada directorio "a+ dos entradas como mnimo !ue son - - + - - !ue referencian respecti'amente al directorio actual + al directorio padre (Cuando no tenemos en la 'ariable 0P2T/ referenciado el subdirectorio actual tendremos !ue e&ecutar los comandos de nuestro directorio actual mediante 8 comando) El carcter -8- se utili#a para separar los diferentes componentes de un nombre de fic"ero + por eso no se puede usar como pare de un nombre de fic"ero El carter nulo se usa como fin de cadena en en len%ua&e C !ue es el len%ua&e en el !ue est escrito el () Por eso tampoco se puede usar ese caracter como nombre de fic"ero Cuando usamos un nombre de fic"ero !ue empie#a por -8- se llama nombre de camino completo o nombre de camino absoluto (i por el contrario empie#a por - -. por - -. o por un nombre se denominar nombre de camino relati'o. por!ue su utili#acin depende del subdirectorio actual donde nos encontremos ,a ltima parte del nombre despu5s del ltimo carcter -8- se llama nombre base basename(3)
$ ERemplo de "so del comando basename $ basename M"srMincl"deMsysMsi&nal+h si&nal+h

,os fic"eros !ue empie#an por - - no tienen realmente nada de especial Xa e$plicamos !ue la s"ell no e$pande los nombres de estos fic"eros + al%unos comandos como -ls- + otros los consideran de una forma especial Por e&emplo al usar el comando -ls- sin parmetros no muestra esos fic"eros Por todo ello aparentan ser in'isibles cuando en realidad son al%unos comandos como -ls- + el propio -bas"- !uienes los tratan de forma especial 7uc"os fic"eros !ue son de uso particular de al%unos pro%ramas se usan de esta forma para !ue el usuario pueda i%norarlos en condiciones normales En -msdos- e$iste un concepto llamado e$tensin Corresponde con un m$imo de tres caracteres despu5s del ltimo punto en un nombre de fic"ero En *ni$ los nombres pueden tener 'arios puntos + despu5s del ltimo punto puede "aber ms de tres caracteres alfanum5ricos +a !ue no e$iste el concepto de e$tensin De e$istir nombres !ue terminan de una cierta forma puede tener si%nificado especial para al%unos pro%ramas pero no para ncleo (kernel) + tampoco para el interprete de comandos ,o !ue si tiene un tratamiento especial a ni'el de sistema operati'o son los caracteres -8- !ue for#osamente indican los elemento de un camino formado por la sucesin de caracteres Es decir ser imposible crear un fic"ero con nombre -$8a- dentro de un directorio por!ue el sistema interpretara !ue !ueremos crear un fic"ero -a- dentro de un directorio -$Coman os para mane2ar el sis!ema e 5ic+eros ;elacin de comandos ms importantes para mane&ar el sistema de fic"eros
ls %lista/ K"estra el contenido de directorio act"al+ cd %dir/ Cambiar a "n s"bdirectorio+ m>dir %lista0dir/ Crea "no o mas directorio+ rmdir %lista0dir/ Sorra "no mas directorios+ cp %lista/ Copiar "no o mas 'icheros al "ltimo de la lista+ <i mas de dos el "ltimo debe ser "n directorio+ mv %lista/ mover o renombrar 'icheros o directorios al "ltimo nombre de la lista+ <i mas de dos el "ltimo debe ser "n directorio+ rm %lista/ borrar la lista de 'icheros+ ln Crear "n enlace a "n 'ichero

to"ch pwd chmod chown ch&rp d" %'ichero/ tree tree 0d 'ile %'ichero/

Crea "n 'ichero vacNo o modi'ica la 'echa de "n 'ichero m"estra el camino absol"to del directorio act"al+ Cambia los permisos de "n 'ichero+ Cambia el propietario de "n 'ichero+ Cambia el &r"po de "n 'ichero+ Oc"paci)n de "n 'ichero Tistado rec"rsivo Kostrar Frbol de directorios Obtiene in'ormaci)n sobre el tipo de ,icheros

;ecuerde !ue tiene a sus disposicin el comando -man- para consultar las distintas opciones de cada uno de estos comandos Alias para el #so e los coman os ms 5rec#en!es El comando -cd- es un comando interno !ue sir'e para cambiar de directorio actual E$iste otro comando interno llamado -alias- !ue sir'e para al%o !ue no tiene !ue 'er con el sistema de fic"eros + sin embar%o lo mencionaremos a!u por ra#ones prcticas En muc"os sistemas parecer !ue e$iste la disponibilidad de usar un comando -ll- !ue sir'e para mostrar un directorio con abundante informacin En realidad se trata de un alias *sted puede 'erificar los alias definidos para su usuario tecleando -alias- sin ar%umentos =eneralmente se usa para abre'iar el uso de comandos mu+ utili#ados Esto puede resultarle de inter5s para personali#ar su entorno Cuando el interprete de comandos arranca se e&ecutan una serie de fic"eros -8etc8profile-. -\8 bas"Jprofile-. -\8 bas"Jlo%in-. + -\8 profile- en este orden En - bas"Jprofile- suele e$istir una parte !ue pre%unta por la e$istencia de un -\8 alias- + en caso afirmati'o lo e&ecuta Este fic"ero - aliascontiene una serie de comandos de alias !ue permanecern disponibles durante su sesin de traba&o con esa s"ell Podra parecer !ue estamos obsesionados con la s"ell + !ue no sabemos "ablar de otra cosa pero solo !ueremos proporcionarle a"ora unos conse&os prcticos !ue le faciliten el uso de su sistema Para ello tendra !ue editar el fic"ero - alias- presente en su 0/)7E + a6adir las lneas si%uientes1
alias alias alias alias alias alias alias alias ll=$ls 0lrt 00color=a"to$ ll+=$ls 0adlrt 00color=a"to +5a0(A0UB0D64$ ls=$ls 00color=a"to$ ls+=$ls 0adrt 00color=a"to +5a0(A0UB0D64$ md=$m>dir$ mv=$mv 0i$ rd=$rmdir$ rm=$rm 0i$

Puede e&ecutar el fic"ero - alias- para definir todos estos alias


$ + +alias

) puede e&ecutar cual!uiera de estos comandos alias a"ora mismo. por e&emplo
$ alias ll=$ls 0lrt 00color=a"to$

,ue%o teclee el comando -alias- Comprobar !ue !ueda definido Teclee el nue'o comando -ll- + compruebe su efecto El bas" solo e$pande los alias de la primera palabra de un comando + solo cuando no 'an entrecomillados Por eso cuando definimos un alias !ue sustitu+e a un comando (Por e&emplo ?lsQ-ls GGcolorQauto-?) tendremos !ue usar -ls- entre comillas simples o dobles para si no deseamos !ue se produ#ca la e$pansin del alias Para eliminar una definicin de alias utilice el comando -unalias- En nuestro caso
$ "nalias ll

Para no tener !ue teclear manualmente cada 'e# cada uno de estos alias es para lo !ue sir'e el fic"ero - alias(i no sabe editarlo tendr !ue esperar a !ue e$pli!uemos el mane&o del editor -'i- + 'ol'er a esta seccin para modificar su fic"ero - alias- ,os alias sern definidos la pr$ima 'e# !ue entre en una nue'a sesin E$plicaremos las 'enta&as de usar al%unos de los alias !ue acabamos de proponerle ll ,os fic"eros ms interesantes son %eneralmente los ms recientes + para e'itar !ue desapare#can durante un scroll lar%o los mostraremos en ltimo lu%ar ,a opcin de color auto colorea la salida del comando nicamente si la salida ocurre en el terminal ll: (ir'e para listar fic"eros !ue empie#an por un punto + despu5s tienen una letra o d%ito como se%undo carcter Normalmente los fic"eros de confi%uracin de su usuario se encuentran en su 0/)7E + utili#an nombres de este tipo !ue no aparecen en la e$pansin de un -Yrm Este alias e'ita usar -rm- tal cual est a6adi5ndole la opcon Gi para confirmar antes de borrar ;ealmente til Es mu+ recomendable usar -rm- por defecto de esta forma (i no desea ser interro%ado a cada fic"ero si realmente desea borrarlo o no. utilice este alias tal como est pero a6adiendo la opcin Gf rm Gf IlistaGdeGfic"erosK borrar silenciosamente todo lo !ue usted ordene !ue no tiene !ue coincidir con todo lo !ue usted supone !ue "a ordenado En especial si no pone cuidado al usar la e$pansin de ordenes de la s"ell ,a respuesta a la pre%unta de como recuperar un fic"ero borrado accidentalmente es -De nin%una formaCosas simpticas de *ni$ + ,inu$ Puede !ue sepa de al%uien !ue en cierta ocasin recuper una informacin 'aliosa usando trucos o "erramientas especiales pero no cuente con ello /a+ pro%ramas de borrado !ue usan papeleras + !ui#s piense en poner un alias de rm para !ue use uno de estos pro%ramas Esto introduce ineficiencia en el sistema pero puede "acerse a ni'el de usuario ,o ms correcto es usar una buena poltica de copias de se%uridad m0 (e trata de mo'er informacin pero aplicamos el mismo principio !ue para -rmE2emplos e #so e los coman os es!# ia os E&ecutaremos paso a paso una serie de comandos + comprobaremos lo !ue ocurre

$ $ $ $ $ $ $ $

Crearemos "n alias para ls con al&"nas opciones alias ll=$ls 0lrt 00color=a"to$ Creamos en Mtmp "na serie de directorios anidados cd Mtmp m>dir >>>> cd >>>> Cons"ltamos en #"e directorio estamos sit"ados pwd

MtmpM>>>> $ $ $ $ $ $ $ $ Contin"amos creando 'icheros y directorios echo xx / >>@ echo xx / >>8 echo xx / >>3 m>dir >>>> Lsamos el alias por primera ve( para ver el contenido del directorio act"al+ ll @ @ @ 8 acastro acastro acastro acastro acastro acastro acastro acastro 3 3 3 @B8C abr abr abr abr @; @; @; @; 8BVB@ 8BVB@ 8BVB@ 8BVB@ >>@ >>8 >>3 >>>>

total C 0rw0r00r00 0rw0r00r00 0rw0r00r00 drwxr0xr0x $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $

Contin"amos creando 'icheros y directorios cd >>>> echo xx / >>@ echo xx / >>8 echo xx / >>3 m>dir >>>> cd >>>> echo xx / >>@ echo xx / >>8 echo xx / >>3 cd MtmpM>>>> El alias ll corresponde con el comando ls con "na serie de opciones pero podemos aWadir n"evas opciones+ !or eRemplo podemos hacer "n listado rec"rsivo de toda la estr"ct"ra de 'icheros y directorios #"e c"el&a del directorio act"al+ MtmpM>>> ll 0R + @ @ @ 3 acastro acastro acastro acastro acastro acastro acastro acastro 3 3 3 @B8C abr abr abr abr @; @; @; @; 8BVB@ 8BVB@ 8BVB@ 8BVB3 >>@ >>8 >>3 >>>>

total C 0rw0r00r00 0rw0r00r00 0rw0r00r00 drwxr0xr0x >>>>V total C 0rw0r00r00 0rw0r00r00 0rw0r00r00 drwxr0xr0x >>>>M>>>>V total 3 0rw0r00r00 0rw0r00r00 0rw0r00r00

@ @ @ 8

acastro acastro acastro acastro

acastro acastro acastro acastro

3 3 3 @B8C

abr abr abr abr

@; @; @; @;

8BVB3 8BVB3 8BVB3 8BVBC

>>@ >>8 >>3 >>>>

@ acastro @ acastro @ acastro

acastro acastro acastro

3 abr @; 8BVBC >>@ 3 abr @; 8BVBC >>8 3 abr @; 8BVBC >>3

$ Con el comando tree y la opci)n 0d podemos ver la estr"ct"ra $ simplemente con los directorios y como estFn colocados+ $ tree 0d + =00 >>>>

Para borrar todo esto se suele usar la opcin de borrado recursi'o No debe usar esta opcin como root sin estar mu+ se%uro de lo !ue "ace Esta opcin borra recursi'amente + es mu+ peli%rosa por!ue un error puede borrar recursi'amente desde un lu%ar e!ui'ocado un montn de informacin No es necesario borrar nada por!ue en 8tmp la informacin suele borrarse durante el arran!ue (i !uiere intentarlo con las precauciones mencionadas teclee -rm Gfr 8tmp8kkkk- (i lo prefiere puede de&arlo sin borar +a !ue no ocupa casi nada + se borrar la pro$ima 'e# !ue se 'ace el -8tmp- !ue ser se%uramente cuando 'uel'a a arrancar el ordenador Para !ue los comandos anteriores puedan funcionar correctamente deberemos tener los permisos adecuados sobre los fic"eros + los subdirectorios E'identemente "a+ muc"os ms + no podemos e$plicarlos todos a"ora pero !ui#s sea bueno mostrar una pe!ue6a lista de al%unos de ellos !ue 'eremos ms adelante en posteriores captulos
s"m c>s"m &(ip 'ind tar cpio Obtiene "n valor de chec>s"m Obtiene "n valor de chec>s"m lar&o y por tanto mFs se&"ro Compresor de X.L S"scar 'icheros Empa#"eta 'icheros y directorios en "n solo 'ichero+ Empa#"eta 'icheros y directorios en "n solo 'ichero+

Sis!ema plano e 5ic+eros ,a estructura en forma de rbol tiene el incon'eniente de !ue se re!uiere ir recorriendo el rbol para ir locali#ando cada uno de los elementos Por ello se "ace necesario un sistema muc"o ms directo 2 cada fic"eros se le asocia un nmero para poder locali#arlo directamente Dic"o nmero se llama inodo ,os nmeros de inodos son el ndice del sistema plano de fic"eros. tambi5n llamado por ello tabla de inodos Cada fic"ero de cada sistema de fic"eros tiene un inodo distinto sal'o !ue se trate de un enlace r%ido ("ard link) (in embar%o "a+ inodos !ue no se corresponden con nin%n fic"ero *n fic"ero en sentido estricto indica capacidad de contener una secuencia de b+tes *n inodo indica bsicamente la capacidad de tener un nombre asociado al sistema de fic"eros *n fic"ero tiene asociadas funciones de posicin + de lectura + escritura de informacin dentro del fic"ero *n inodo es una referencia mu+ directa a un fic"ero + a %randes ras%os tiene asociadas funciones !ue permiten mane&ar + construir la estructura de rbol del sistema de fic"eros Tipos e 5ic+eros

;e%ular (on meros almacenes de informacin 2l%unos contiene cdi%o e&ecutable Directorios (on una tabla con nmeros de inodos + nombres de fic"eros Nic"eros especiales Pueden ser dispositi'o tipo carcter o dispositi'o de blo!ues El mane&o de estos fic"eros depende del dispositi'o en particular Nifo son pipes con nombre (on propios de (+stem V + en <(D no e$isten pero en ,inu$ si estn disponibles Enlaces simblicos (s+mbolic links) (on fic"eros !ue contiene un puntero a otro fic"ero !ue podra perfectamente estar en un sistema de fic"eros distinto El (oket es un fic"ero especial de A L <(D + se utili#a para comunicar procesos !ue pueden estar en m!uinas distintas Enlaces r%idos ("ard links) ;ealmente es un nico fic"ero !ue puede ser 'isto con distintos nombres dentro de un mismo sistema de fic"eros Es decir se pueden obser'ar como si fueran fic"eros id5nticos con el mismo inodo ,a informacin reside en un mismo lu%ar + lo !ue ocurra aparentemente en un sitio ocurrir instantneamente en el otro lu%ar ,os enlaces de este tipo no pueden ocurrir entre sistemas de fic"eros distintos No todos los sistemas de fic"eros soportan "ard links +a !ue es un concepto mu+ li%ado a los () tipo *ni$

=eneralmente los diferentes tipos de fic"eros son capaces de aceptar operaciones de apertura. cierre. lectura + escritura de forma similar Por ello se puede rediri%ir una entrada + una salida a diferentes

tipos de fic"eros Parte de la enorme potencia + fle$ibilidad de los () tipo *ni$ residen en este "ec"o =racias a esto la combinacin de entradas salidas entre procesos. fic"eros. dispositi'os. etc resulta mu+ sencilla + fle$ible E$iste una sal'edad importante ,os directorios en este sentido son totalmente especiales + un intendo de escribir en un directorio dar siempre un error aun!ue sea reali#ado por -root- No tiene sentido permitirlo ,os directorios se crean. borran. + modifican con comandos especficos para ellos
$ echo / + bashV +V Es "n directorio

A!rib#!os e 5ec+a en 5ic+eros En *ni$ + ,inu$ los fic"eros en sentido amplio tienen asociadas siempre tres fec"as En realidad estas fec"as estn almacenadas internamentte como el nmero de se%undos transcurridos desde el -3 de Enero de 3FaD*na de ellas indica el tiempo del ltimo acceso reali#ado sobre ese fic"ero ,a otra indica la fec"a de creacin (en realidad es la fec"a del ltimo cambio de estado) de ese fic"ero + la ltima + !ui#s ms importante (es la !ue 'emos al consultar con -ls Gl-) indica la fec"a de la ltima modificacin En realidad si cambiamos el estado de un fic"ero por e&emplo cambiando permisos o el propietario se modificarn las fec"as de creacin + del ltimo acceso Por eso la fec"a !ue "emos denominado de creacin puede ser posterior a la fec"a de modificacin del fic"ero Cuando se crea un fic"ero las tres fec"as tendrn el mismo 'alor Cuando se lee un fic"ero se modifica la fec"a de acceso del mismo pero acceder al nombre de un fic"ero o consultar el estado de un fic"ero no modifica nin%una fec"a (u fec"a de acceso tampoco +a !ue en realidad lo !ue se "ace es leer la informacin del directorio !ue lo contiene el cual si !ue 'er modificada su fec"a de acceso ,as fec"as de modificacin asociadas a los directorios cambian con las altas. o ba&as de los elementos dentro del directorio Esto es debido a !ue dic"as operaciones se consideran como si fueran escrituras en el fic"ero especial de tipo directorio *n directorio es al fin + al cabo una simple tabla Esto lo recordaremos cuando "ablemos de permisos asociados a directorios Para modificar las fec"as de modificacin + de acceso de un fic"ero se puede usar el comando touc" (3)

SISTE-A "E 9IC*E1OS Se/#n a par!e


Permisos de fic"eros Notacin num5rica para permisos *mask Comando c"mod Comando c"o>n Concesin de acceso por parte del kernel (i%nificado de los permisos en directorios (etuid + (et%id Test

Permisos e 5ic+eros *saremos el t5rmino fic"ero en su sentido ms amplio Es decir !ue el tema de permisos es aplicable a distintos tipos de fic"eros con al%unas mati#aciones !ue e$plicaremos ms adelante ,os fic"eros tienen muc"os atributos adems de su nombre Para 'er los ms si%nificati'os "aremos1

$ ls 0l M

(upon%amos !ue tenemos el si%uiente fic"ero llamado -kkkkk0rwxrwxrwx @ root root @C3CB abr @E @8VBE >>>>> YYYYYYYYYY Y Y Y Y Y Y Y Y Y 7777777777 7 7 7 7 7 7 7 7 7__nombre del 'ich+ 7777777777 7 7 7 7 7 7 7 7 7777777777 7 7 7 7 7 7 7 7__min"tos V ,echa y 7777777777 7 7 7 7 7 7 7_____hora V hora de la 7777777777 7 7 7 7 7 7____dNa del m1s V Gltima 7777777777 7 7 7 7 7________m1s V modi'icaci)n 7777777777 7 7 7 7 7777777777 7 7 7 7___________ IamaWo en bytes 7777777777 7 7 7 7777777777 7 7 7_______nombre del &r"po 7777777777 7 7____________nombre del propietario del 'ichero 7777777777 7 7777777777 7_______________nGmero de enlaces rN&idos ?hard lin>sA 7777777777 7777777777___BB@____________ permiso de eRec"ci)n para V Ln "s"ario 777777777____BB8____________ permiso de escrit"ra para V c"al#"iera 77777777_____BBC____________ permiso de lect"ra para V 7777777 7777777______B@B____________ permiso de eRec"ci)n para V Ln "s"ario 777777_______B8B____________ permiso de escrit"ra para V pertene0 77777________BCB____________ permiso de lect"ra para V ciente al 7777 V &r"po 7777 7777_________@BB____________ permiso de eRec"ci)n para V El "s"ario 777__________8BB____________ permiso de escrit"ra para V propieta0 77___________CBB____________ permiso de lect"ra para V rio 7 7____________________________tipo de 'ichero 0 ,ichero re&"lar ?'ichero normalA d Hirectorio l Enlace simb)lico p ,i'o con nombre b Hispositivo de blo#"es c Hispositivo de caracteres

En in%l5s se usan los t5rminos o>ner . %roup. + ot"ers para desi%nar respecti'amente al propietario. al %rupo + a cual!uier usuario No!acin n#m;rica para permisos ;ecuerde !ue tambi5n tenemos !ue pensar en la posibilidad de !ue mi ami%o Da'id acostumbrado al uso del a#adn decida "acer este curso + tenamos un compromiso de e$plicar las cosas partiendo de cero ,os permisos de los fic"eros son almacenados en formato binario + se puede referenciar num5ricamente Vimos !ue a cada permiso indi'idual le asociabamos un nmero de tres d%itos formado por dos ceros + un tercer nmero !ue poda ser unicamente 3. 4. o A Por e&emplo el permiso de escritura para un usuario cual!uiera era DD4 Con estos nmeros se puede codificar los permisos de la forma !ue indicamos en el si%uiente e&emplo1
r w x 0 0 w x 0 r 0 x C 8 @ 0 B 8 @ 0 C B @ Esto e#"ivaldrNa a "n permiso 33E ? C282@ * B282@ * C2B2@ = 3*3*E A

,os permisos tambi5n pueden representarse como una secuencia de bits *n bit es un 'alor !ue solo puede 'aler D o 3 En el caso anterior podramos representarlo de la forma 333 D3D 3D3 donde 3 indica !ue si "a+ permiso D !ue no lo "a+ + la posicin de cada D + cada 3 representa a cada uno de los permisos Umas& Es un comando interno del bas" (e utili#a cuando se crean fic"eros

No podemos profundi#ar muc"o en temas de matemtica binaria por!ue nos saldriamos del tema pero la umask se aplica mediante una operacin llamada 2ND N)T Consiste en tomar a umask como una mscara donde los bits a 3 especifican los bits de permisos !ue se pondrn a cero Por e&emplo si !ueremos abrir un fic"ero con permisos CCA + tenemos una umask de D44 obtendremos un fic"ero CAA
;;C @@B @@B @BB B88 BBB B@B B@B 00000000000000000 ;CC @@B @BB @BB

Esto tiene la utilidad de prote%er el sistema frente a cierto tipo de descuidos durante la creacion de fic"eros Por e&emplo supon%amos !ue un administrador de un sistema considera !ue por defecto todos los fic"eros !ue el crea deberan carecer de permisos de e&ecucion + de escritura para todo el mundo + !ue para los usuarios de su mismo %rupo de beran de carecer de permiso de e&ecucin Para ello establecer una -umask Q D4L- Es decir una umask !ue elimina los permisos G G G G > G G > $ Para un script !ue %enere fic"eros !ue solo deban ser accesibles para el usuario !ue los "a %enerado usaramos -umask Q DaaComan o c+mo Este comando sir'e para alterar una serie de atributos del fic"ero E$iste dos formas de usarlo *na indicando el tipo de acceso + a !uien lo !ueremos conceder o eliminar E$isten una serie de atributos !ue se pueden modificar usando este comando
BCBBB B8BBB B@BBB BBCBB BB8BB BB@BB BBBCB BBB8B BBB@B BBBBC BBBB8 BBBB@ <et "id on exec"te+ <et &id on exec"te+ <ave text on ima&e a'ter exec"tion+ !ermiso de lect"ra para el propietario ?ownerA !ermiso de escrit"ra para el propietario !ermiso de eRec"ci)n para el propietario !ermiso de lect"ra para el &r"po ?&ro"pA !ermiso de escrit"ra para el &r"po !ermiso de eRec"cion para el &r"po !ermiso de lect"ra para c"al#"iera ?othersA !ermiso de escrit"ra para c"al#"iera !ermiso de eRec"cion para c"al#"iera

r w x r w x r w x

,os atributos (et uid. (et %id. + (a'e te$t no los e$plicaremos de momento Consulte las p%inas del manual relati'as a este comando Como de costumbre el manual resulta imprescindible a la "ora de recordar la utili#acin de un comando pero no a la "ora de comprender conceptos nue'os No se preocupe con los e&ercicios !ue le proponemos a continuacin comprender perfectamente1

$ $ $ $ $

cd Mtmp echo / >> chmod 333 >> ls 0l >> ++++ ++++ ++++++

0rwxrwxrwx

$ $ chmod 3B3 >> $ ls 0l >> 0rwx000rwx ++++ ++++ ++++++

$ $ chmod C8@ >> $ ls 0l >> 0r000w000x ++++ ++++ ++++++

$ $ chmod @8C >> $ ls 0l >> 000x0w0r00 ++++ ++++ ++++++ e#"ivale a $chmod BBB >>$

$ $ $chmod B >>$ $ chmod B >> $ ls 0l >> 0000000000

++++ ++++ ++++++

$ $ chmod 2r >> $ ls 0l >> 0r00r00r00 ++++ ++++ ++++++

$ $ chmod 2x >> $ ls 0l >> 0r0xr0xr0x ++++ ++++ ++++++

$ $ chmod 0r >> $ ls 0l >> 000x00x00x ++++ ++++ ++++++

$ $ chmod "2r >> $ ls 0l >> 0r0x00x00x ++++ ++++ ++++++

$ $ chmod a0x >> $ ls 0l >> 0r00000000 ++++ ++++ ++++++

$ $ chmod &2x >> $ ls 0l >> 0r0000x000 ++++ ++++ ++++++

Coman o c+o<n El comando -c"o>n- sir'e para cambiar el *@D + el =@D de un fic"ero Esto solo se puede "acer si tenemos los permisos para ello Normalmente su uso est reser'ado a -root- + por ello no diremos nada ms Es mu+ posible !ue si usted usa ,inu$ en un ordenador personal necesite al%unos de estos conocimientos pero se sale de los propsitos de este curso ,e basta con saber !ue e$iste + para !ue sir'e Concesin e acceso por par!e el &ernel E$plicaremos el funcionamiento de los permisos de la forma ms precisa !ue nos sea posible Para ello usaremos unas abre'iaturas !ue +a conocemos

E*@D es el @dentificador de usuario efecti'o de un proceso E=@D es el @dentificador de %rupo efecti'o de un proceso *@D en un fic"ero es un atributo !ue identifica al propietario =@D en un fic"ero es un atributo !ue identifica al %rupo del propietario

En realidad "ablamos de propietario como el usuario !ue creo el fic"ero El Oernel reali#ar el si%uiente test para conceder a un proceso el acceso de cierto tipo a un fic"ero 3 (i el E*@D del proceso es D se da acceso (root puede "acer lo !ue sea) 4 (i el E*@D del proceso es i%ual al *@D del o>ner (propietario del fic"ero) se concede el acceso si los permisos de usuario r>$ son los adecuados L (i el E*@D del proceso es distinto al *@D del o>ner. + si el E=@D del proceso es i%ual al =@D del o>ner. se concede el acceso si los permisos de %rupo r>$ son los adecuados A (i el E*@D del proceso es distinto al *@D del o>ner. + si el E=@D del proceso es distinto al =@D del o>ner. se concede el acceso si los permisos de ot"ers r>$ son los adecuados N)T2 el comando rm permite borrar cual!uier fic"ero sea cual sean los permisos cuando el proceso tiene un E*@D coincidente con el propietario del fic"ero *nicamente ocurre !ue si el fic"ero esta prote%ido contra escritura suele pedir (dependiendo de la confi%uracin) confirmacion antes de borrarlo El permiso para borrar un fic"ero no se %uarda como atributo del fic"ero Esto se "ace a ni'el de directorio + pasamos a e$plicarlo inmediatamente Si/ni5ica o e los permisos en irec!orios Para entender como funcionan los permisos aplicados a un directorio "a+ !ue ima%inar !ue un directorio es un fic"ero normal !ue solo contiene una tabla en la !ue se relacionan los fic"eros presentes en ese directorio En todos los directorios e$isten siempre un par de entradas obli%adas !ue son - - + - - para el directorio actual + para el directorio padre respecti'amente Vamos a e$plicarlo sobre la marc"a a la 'e# !ue "acemos el e&ercicio ;ecuerde usar un usuario normal (distinto de root) para reali#ar los e&ercicios

$ $ $ $ $ $ $ $ $

cd Mtmp m>dir >> cd >> echo / >@ echo / >8 cd Mtmp chmod 333 >> !ara ver como ha #"edado los permisos hacemos +++ ls 0ld >> 8 +++++ ++++++ >>

drwxrwxrwx

$ !ara ver #"e 'icheros contiene el directorio >> hacemos +++ $ ls >> >@ >8

(i un directorio no tiene permiso de lectura. resultara imposible para cual!uier comando incluido ls a'eri%uar cual es su contenido (in abandonar la sesin anterior continuamos el e&ercicio
$ ?@A $ Eliminamos los premisos de lect"ra del directorio >> $ chmod 0r >> $ ls 0ld >> d0wx0wx0wx $ ls 0l >> lsV >>V !ermiso dene&ado $ En este intante podemos entrar dentro del directorio $ -ncl"so podemos crear "n n"evo 'ichero pero ya no podemos $ <aber c"al es el contenido del directorio+ $ cd >> $ pwd MtmpM>> $ echo / >3 $ ls 0l lsV +V !ermiso dene&ado $ $ $ $ cd Hemos podido meternos dentro del directorio >> por#"e a"n Ienemos permiso para ello pero se&"imos sin poder saber c"al es s" contenido+ Mtmp 8 +++++ ++++++ >>

(i no se tiene permiso de e&ecucion en un directorio no se podra "acer cd a ese directorio. ni a nin%uno de los directorios !ue cuel%an de el Esto imposibilita todas las operaciones !ue utilicen ese directorio como parte del camino (in abandonar la sesin anterior continuamos el e&ercicio

$ ?8A $ Ahora eliminamos permiso de eRec"ci)n $ chmod 0x >> $ ls 0ld >> d0w00w00w0 8 +++++ ++++++ >>

$ -ntentamos entrar $ cd >> bashV cdV >>V !ermiso dene&ado $ .o hemos podido entrar $ rm >>M>8 bashV cdV >>V !ermiso dene&ado $ Iampoco nos deRa borrar el 'ichero desde '"era $ $ Rec"peramos permiso de eRec"ci)n $ chmod 2x >> $ ls 0ld >> d0wx0wx0wx $ rm >>M>8 $ ls >> >@ 8 +++++ ++++++ >>

(i no tiene permiso de escritura no se podra dar altas. ba&a o modificaciones en la tabla lo !ue se traduce en !ue no se pueden borrar sus fic"eros ni crear otros nue'os. ni renombrar fic"eros (in abandonar la sesin anterior continuamos el e&ercicio

$ ?3A $ Ahora eliminaremos permisos de escrit"ra $ chmod ;;; >> $ ls 0ld >> dr0xr0xr0x 8 +++++ ++++++ >>

$ Ahora no tenemos permiso de escrit"ra $ cd >> $ ls rmV Zborrar =>@$[ ?sMnA s rmV >@V !ermiso dene&ado $ echo / >3 bashV >3V !ermiso dene&ado $ to"ch >3 to"chV >3V !ermiso dene&ado $ <in permiso de escrit"ra en el directorio no se p"eden $ Crear 'icheros n"evos dentro de el ni borrar 'icheros $ !ero los 'icheros son per'ectamente accesibles $ echo OKensaRe de pr"ebaO / >@ $ cat >@ KensaRe de pr"eba $ Vamos a limpiar $ chmod 333 MtmpM>> $ rm MtmpM>>M4 $ rmdir MtmpM>>

Se!#i 4 Se!/i Cada proceso tiene un (;)*@D. (;)=@D. E*@D. + E=*@D Cada fic"ero tiene un *@D + un =@D o>ner El comando -c"mod ADDD- pone el bit setuid Esto "ace !ue el proceso !ue e&ecuta este comando temporalmente cambie su E*@D tomando el 'alor *@D del fic"ero Es decir el proceso sufre un cambio de personalidad + se con'ierte en la persona !ue fi%ura como propietaria de ese fic"ero Para ello l%icamente ese fic"ero deber ser un e&ecutable El comando pass>d sir'e para cambiar la cla'e (e trata de un comando propiedad de root con setuid Por lo tanto mientras estamos e&ecutando este comando adoptamos la personalidad de -root- =racias a ello se nos permite acceder a la cla'e para modificarla + %racias a !ue ese comando no permite "acer nada ms !ue eso se e'ita !ue este proceso con personalidad de -root- pueda "acer otras cosas <us!ue el comando -pass>d- en su sistema Podra estar en -8usr8bin8pass>d- pero si no se encuentra en ese sitio puede locali#arlo con ->"ic" pass>d/a%a un ll para comprobar sus permisos + 'er !ue es propiedad de -root- + !ue tiene una -s- en lu%ar de una -$- en la parte de los permisos para el propietario
0rwsr0xr0x @ root root 8::D; R"l @3 @DD: M"srMbinMpasswd

El comando -c"mod 4DDD- pone el bit set%id on e$ecute /ace al%o parecido al anterior pero a ni'el de %rupo Es decir el proceso !ue e&ecuta este comando temporalmente cambie su E=@D tomando el 'alor =@D del fic"ero Por e&emplo el comado lpr no solo nos con'ierte en -root- cuando lo e&ecutamos sino !ue nos cambia el %rupo por el %rupo de impresin
0rwsr0sr0x @ root lp @C:CC 'eb 3 @DDD M"srMbinMlpr

El comando -c"mod 3DDD- pone el bit stick+ (e usa poco + tena ms utilidad en sistemas *ni$ ms

anti%cos (ir'e para !ue el proceso permane#ca en memoria ;27 todo el rato mientras se est5 e&ecutando Normalmente cuando muc"os procesos usan la memoria ;27 se 'an turnando en su uso + se descar%an a disco para ceder su espacio en memoria ;27 a otros procesos Con el uso de este bit se e'ita la descar%a a disco Es una forma de aumentar la 'elocidad de ese proceso Para 'er el aspecto de estos permisos realice el si%uiente e&ercicio ;ealice siempre los e&ercicios desde un usuario normal distinto de root
$ $ $ $ cd Mtmp echo / >> chmod CBBB >> ll >> @ +++++ +++++ >>

000<000000

$ chmod C@BB >> 000s000000 @ +++++ +++++ >>

$ chmod 8BBB >> 000000<000 @ +++++ +++++ >>

$ chmod 8B@B >> 000000s000 @ +++++ +++++ >>

$ chmod @BBB >> 000000000I @ +++++ +++++ >>

$ chmod @BB@ >> 000000000t @ +++++ +++++ >>

SISTE-A "E 9IC*E1OS Tercera par!e


Tipos de enlaces (links) + su mane&o 7onta%e de dispositi'os Directorio 8proc (istema de fic"eros 'irtual Estructura estandar del sistema de fic"eros de ,inu$ Test

Tipos e enlaces %lin&s' 4 s# mane2o ,a palabra link es in%lesa + para el concepto !ue 'amos a tratar podramos traducirla por enlace /a+ dos tipos de enlaces llamados -"ard link- + -s+mbolic link- Podriamos traducirlo por enlace r%ido + por enlace simblico El t5rmino enlace simblico se usa con frecuencia en espa6ol + parece mu+ adecuado pero realmente no e$iste una traduccin para "ard link tan aceptada Nosotros emplearemos el t5rmino r%ido para "ard !ue literalmente si%nifica duro Xa "emos mencionado al%unas cosas sobre ellos pero sin profundi#ar demasiado El mane&o de ambos tipos de enlaces se "ace con el comando -ln- Como es "abitual un repaso a la p%ina man de este comando es mu+ recomendable ,a creacin de un enlace r%ido + uno simblico es mu+ similar ,a diferencia es !ue para el enlace simblico tendremos !ue usar la opcin Gs Como es "abitual asumimos !ue las prcticas se reali#arn desde un usuario distinto de root

$ $ $ $ $ $ $ $ $ $ $ $ $

cd Mtmp m>dir Mtmp8 cd tmp8 echo xxxx / eRB Ahora creamos "n par de enlaces rN&idos con eRB ln eRB eR@ ln eRB eR8 Creamos tambi1n "n enlace simb)lico eRs@ a eRB ln 0s eRB eRs@ m>dir dir@ Iambi1n creamos "n enlace simb)lico dir8 a dir@ ln 0s dir@ dir8 ls 0l 8 @ 3 3 3 @ pepe pepe pepe pepe pepe pepe "ser @B8C may @: @3V8: dir@ "ser C may @: @3V8: dir8 0/ dir@ "ser @ may @: @3V8; eRB "ser @ may @: @3V8; eR@ "ser @ may @: @3V8; eR8 "ser 3 may @: @3V8: eRs@ 0/ eRB

drwxr0xr0x lrwxrwxrwx 0rw0r00r00 0rw0r00r00 0rw0r00r00 lrwxrwxrwx

Con esto acabamos de crear dentro de tmp un directorio tmp4 + dentro de el "emos creado +a al%unos fic"eros. al%unos directorios + unos cuantos enlaces r%idos + simblicos ,os enlaces r%idos no muestran nada particular listados con -ls Gl- pero los enlaces simblicos 'ienen acompa6ados de una flec"a !ue apunta a otro nombre de fic"ero El fic"ero -e&D- lo "emos creado con un contenido -$$$$- para 'er !ue pasa con ese contenido ms adelante El nombre de usuario -pepe- + el nombre de %rupo -users- son ficticios + en su sistema obtendr otra cosa /a+ una columna de nmeros a continuacin de los permisos (e trata de una columna !ue indica el nmero de enlaces r%idos !ue estn asociados a un mismo fic"ero En el caso de -e&D-. -e&3-. -e&4- aparece un L + est claro por!ue son enlaces creados por nosotros pero el directorio -dir3- tiene un 4 Esto si%nifica !ue e$iste otro enlace r%ido para ese directorio !ue nostros no "emos creado (e "a creado automticamente al crear -dir3- 2cuerdese !ue todos los directorios se crean con un par de entradas !ue son - - + - - El 4 por lo tanto en este caso se debe a la entrada - - dentro del propio -dir3- + si dentro de -dir3- e$istieran directorios "abra !ue contabili#ar cada uno del los - - de los directorios "i&os como enlaces r%idos de -dir3- *n fic"ero se corresponde con un nico inodo Es decir tiene una nica entrada en la tabla plana del sistema de fic"eros. pero !ui#s apare#ca 'arias 'eces en distintas partes del sistema de fic"eros. o con distinto nombre (i esto ltimo no le "a !uedado claro 'uel'a a leerlo despu5s de finali#ar este captulo por!ue 'amos a se%uir e$iplicando !ue es un enlace r%ido 2"ora retomamos la prctica en el punto donde la de&amos + continuamos
$ cat eRB xxxx $ echo >>>>>>>>> / eR@ $ cat eRB >>>>>>>>> $ cat eRs@ >>>>>>>>>

Vemos !ue el contenido de los distintos enlaces con -e&D- es id5ntico. + si modificamos el contenido de cual!uiera de ellos se afectar instantaneamente el contenido de los restantes En realidad la informacin es accesible desde distintos nombres de fic"eros pero no son copias sino !ue se trata de la misma unidad de informacin Continuamos con el e&ercicio

$ rm eRB $ cat eRs@ catV eRs@V .o existe el 'ichero o el directorio $ cat eR@ >>>>>>>>>

2!u +a 'emos una diferencia Pese a !ue -e&3- se cre como un enlace de -e&D-. -e&3- mantiene accesible la informacin incluso aun!ue desapare#ca -e&D- Eso es por!ue en el caso de los enlaces r%idos da i%ual cual es el enlace o fic"ero ori%inal (on totalmente e!ui'alentes + la informacin solo desaparecer del sistema cuando el ltimo enlace r%ido sea eliminado ,a diferencia con el enlace simblico es !ue actua simplemente accediendo al nombre del fic"ero !ue tiene almacenado en su interior Por eso en el caso !ue acabamos de 'er -e&s3- !ueda apuntando a -e&D- !ue es un fic"ero !ue +a no e$iste Continuamos con el e&ercicio + a"ora usaremos una opcin para -ls- !ue no "abamos 'isto antes (e trata de la opcin Gi !ue sir'e para 'isuali#ar el nmero de inodo *n inodo es una cla'e num5rica para el acceso al sistema plano de fic"eros donde cada punto capa# de recibir o entre%ar informacin. tiene una nica cla'e Por eso los distintos enlaces r%idos contienen el mismo 'alor de inodo ,o de recibir o entre%ar informacin se traduce en c"orros de b+tes producidos en operaciones de lectura escritura pero estas funciones pese a mane&arse siempre i%ual reali#an cosas mu+ distintas dependiendo del tipo de fic"ero *n fic"ero re%ular es un almac5n de informacin )tros tipos de fic"eros no son meros contenedores de b+tes Por e&emplo los dispositi'os especiales de blo!ues o de caracteres pueden 'erse como emisores + receptores de blo!ues o caracteres respecti'amente asociados a un dispositi'o Tampoco son meros contenedores de b+tes los sockets. enlaces simblicos. fifos con nombre. etc (al'o los directorios. todos son capaces de reco%er c"orros de b+tes o de entre%ar c"orros de b+tes o ambas cosas a la 'e# + lo ms importante. todos ellos tienen asociado un inodo + al menos un nombre de fic"ero col%ando de al%una parte de sistema de fic"eros ,os directorios no se pueden mane&ar con funciones clsicas de lectura escritura Tienen sus propias funciones especficas para mane&o de directorios
$ ls 0li 33CCD ED@33 ED@3@ ED@3@ ED@38 drwxr0xr0x lrwxrwxrwx 0rw0r00r00 0rw0r00r00 lrwxrwxrwx 8 @ 8 8 @ pepe pepe pepe pepe pepe "ser @B8C may @: @3V8: dir@ "ser C may @: @3V8: dir8 0/ dir@ "ser @B may @: @3V3B eR@ "ser @B may @: @3V3B eR8 "ser 3 may @: @3V8: eRs@ 0/ eRB

Como se puede 'er -e&3- + -e&4- tienen el mismo 'alor de BF3a3 !ue en su sistema ser otro 'alor cual!uiera En este momento despu5s de borrar -e&D- fi%uran con el 'alor 4 para el nmero de enlaces r%idos asociados Vamos a mo'er el enlace simblico -e&s3- a -dir3- pero 'amos a usar -m' e&s3 dir4en lu%ar -m' e&s3 dir3- pero debera dar lo mismo +a !ue -dir4- es un enlace simblico a -dir3-

$ mv eRs@ dir8 $ $ Comprobamos el res"ltado $ ls 0li 33CCD ED@33 ED@3@ ED@3@ drwxr0xr0x lrwxrwxrwx 0rw0r00r00 0rw0r00r00 8 @ 8 8 pepe pepe pepe pepe "ser @B8C may @: @3V38 "ser C may @: @3V8: "ser @B may @: @3V3B "ser @B may @: @3V3B dir@ dir8 0/ dir@ eR@ eR8

$ ls dir8 eRs@ $ ls 0li dir@ ED@38 lrwxrwxrwx @ pepe "ser 3 may @: @3V8: eRs@ 0/ eRB

/emos comprobado !ue un enlace simblico se "a comportado i%ual !ue si fuera el propio directorio apuntado En realidad podemos actuar a todos los efectos como si se tratara del 'erdadero fic"ero en lu%ar de un enlace simblico sal'o en el momento de su creacin + en el momento de su destruccin ,a operacin -rm- sobre un fic"ero simblico no actua sobre el fic"ero apuntado sino sobre el propio enlace simblico destru+endolo 2"ora tenemos -dir48e&s3 GK e&D- pero -e&D- ni si!uiera e$iste Vamos a cambiar el nombre de -e&4- !ue era un enlace r%ido de -e&D- por -e&D$ mv eR8 eRB $ cat dir8MeRs@ catV dir8MeRs@V .o existe el 'ichero o el directorio

<ueno este error es l%ico por!ue el enlace -dir48e&s3- apunta a -e&D- + no importa !ue estemos en el mismo directorio !ue -e&D- sino !ue -dir48e&s3- + -e&D- est5n en el mismo directorio ,os enlaces son siempre relati'os al sitio donde se encuentra el propio enlace En caso contrario podra resultar %raciossimo pero poco prctico por!ue dependiendo de donde estu'ieramos nosotros ( ms e$actamente dependiendo del directorio actual del proceso !ue lo use) apuntara a un directorio distinto cada 'e# De todas formas comprobemoslo trasladando -e&D- a -dir4-. + obser'ando como "a !uedado todo

$ mv eRB dir8 $ cat dir8MeRs@ >>>>>>>>> $ ls 0li 33CCD drwxr0xr0x ED@33 lrwxrwxrwx ED@3@ 0rw0r00r00 $ ls 0li dir8 ED@33 lrwxrwxrwx $ rmdir dir8 rmdirV dir8V .o es "n directorio $ rm dir8 $ ls 0li 33CCD drwxr0xr0x ED@3@ 0rw0r00r00 $ ls 0li dir@ ED@3@ 0rw0r00r00 ED@38 lrwxrwxrwx 8 pepe "ser @ pepe "ser @B may @: @3V3B eRB 3 may @: @3V8: eRs@ 0/ eRB 8 pepe "ser @B8C may @: @3V3C dir@ 8 pepe "ser @B may @: @3V3B eR@ @ pepe "ser C may @: @3V8: dir8 0/ dir@ 8 pepe "ser @B8C may @: @3V3C dir@ @ pepe "ser C may @: @3V8: dir8 0/ dir@ 8 pepe "ser @B may @: @3V3B eR@

-on!a/e e isposi!i0os Pueden e$istir 'arios sistemas de fic"eros cada uno en un dispositi'o o particin distinta. pero para "acerlo accesible "a de ser montado dentro del sistema principal de fic"eros Para ello se utili#an los comandos -mount- + -umountE$plicaremos esto un poco ms (upon%amos !ue dispone de un dis!uete en el !ue desea %uardar informacin accesible como parte del sistema actual En 7(D)( se accedera a la unidad !ue representa este dispositi'o mediande el comando a1 o b1 por e&emplo En *ni$ esto no ocurre por!ue ese pat5tico in'ento llamado unidad l%ica no e$iste Perdn por lo de pat5tico pero es !ue en 7(D)(. + en Mindo>s cambias las cosas de sitio + terminas reinstalando todo (upon%amos !ue tenemos en un dispositi'o cdrom. cinta. dis!uete. o lo !ue sea la si%uiente estructura de directorios
+ 700 700 700 700 700 700 =00 X"ia0del0enROOIador08+: c"rso &l"p_B+;0@+@0html0@+@ lipp0@+@0html0@+@ man_instal_debian_8@ novato0a0novato rhl0i&0;+Bes 700 cpps =00 icons

Para poder acceder a esta informacin tendramos !ue reali#ar una operacin de montado sobre al%n punto de nuestro sistema de fic"eros actual Por e&emplo si disponemos de un directorio -8misc8no'ato- podriamos montar en ese punto nuestro dispositi'o + en ese caso la operacin sera como en%anc"ar un arbol en la rama de otro arbol De esta forma para el sistema sera como si el arbol creciera
+

=00 misc =00 novato 700 X"ia0del0enROOIador08+: 700 c"rso 700 &l"p_B+;0@+@0html0@+@ 700 lipp0@+@0html0@+@ 700 man_instal_debian_8@ 700 novato0a0novato =00 rhl0i&0;+Bes 700 cpps =00 icons

(i el administrador considera !ue montar + un dispositi'o no entra6a ries%os para el sistema concedera permisos para !ue esto pueda ser reali#ado por los usuarios Por e&emplo un administrador puede considerar !ue los usuarios solo puedan montar la unidad de cdrom En un entorno multiusuario + multiproceso no interesa "acer efecti'a las actuali#aciones sobre un dispositi'o de forma instantanea sino !ue se intenta optimi#ar los accesos al dispositi'o Por eso si escribimos en un dispositi'o de lectura escritura como por e&emplo un dis!uete + sacamos dic"o dis!uete antes de desmontarlo lo ms probable es !ue al%unas operaciones de escrituras !ueden sin reali#ar por!ue estaban simplemente %uardadas en memoria a la espera de ser reali#adas Cuando se desmonta un sistema de fic"eros se escriben las operaciones pendientes sobre ese dispositi'o + entonces puede ser e$traido del sistema sin peli%ro "irec!orio =proc Este directorio es un directorio mu+ especial Es un directorio en el cual est montado un sistema de fic"eros 'irtual En realidad muestra informacin !ue no reside en nin%n dispositi'o sino !ue es elaborada por el propio kernel Por ello se trata de falsos arc"i'os (u ocupacin en disco es D (ir'e para comprobar la confi%uracin + el funcionamiento del kernel No entraremos a"ora a comentarlo en detalle por!ue este tema es de inter5s para administradores del sistema ,o !ue nos interesa comentar es !ue a!u la presentacin en forma de sistema de fic"eros es una simulacin + se "ace as para !ue pueda ser mane&ada e$actamente de la misma forma !ue si realmente estu'iera contenida en directorioss + fic"eros 2l%unos de estos fic"eros son de solo lectura otros son de lectura + escritura + permiten cambiar la confi%uracin del kernel sin detenerlo E'identemente todo ello est confi%urado con los permisos adecuados para mantener la se%uridad del sistema (i miramos dentro del directorio -8proc- 'eremos !ue "a+ un montn de directorios cu+o nombre es un nmero Estos directorios representan cada uno a un proceso por su pid Xa "emos estudiado el proceso init en captulos anteriores as !ue 'amos a poner un e&emplo Pruebe a "acer lo si%uiente1
$ cat MprocM@Mstat"s

)btendr la informacin de estado ms importante del proceso init 2dems de contribuir a la cultura %eneral sobre nuestro sistema lo !ue "emos mencionado sobre -8proc- nos sir'e para introducir el si%uiente tema Sis!ema e 5ic+eros 0ir!#al En ,inu$ un sistema de fic"eros puede corresponderse fsicamente + l%icamente con cosas mu+ distintas 2cabamos de 'er !ue el directorio -8proc- aparentemente est or%ani#ado como si fuera un sistema de fic"eros id5ntico a los !ue residen en disco duro + sin embar%o se trata de al%o totalmente distinto *n sistema de fic"eros puede residir. en memoria. en una particin de disco duro. en un dispositi'o raid formado por 'arios discos duros funcionando en paralelo + con un sistema de redundancia. en dis!uetes. en cdroms. en un dispositi'o remoto conectado a red. etc Tambi5n se puede implementar un sistema de fic"eros dentro de un fic"ero Por e&emplo umsdos es un sistema de fic"eros linu$ implementado dentro de un fic"ero msdos ;ealmente es una solucin

mu+ poco eficiente pero pone de relie'e la fle$ibilidad del sistema 'irtual de fic"eros *n sistema de fic"eros puede tener un formato interno !ue no siempre es el mismo ,inu$ puede mane&ar sistemas de fic"eros de otros sistemas operati'os En resumen lo !ue ,inu$ ofrece con su sistema fic"eros 'irtual (VN() es un sistema unificado de acceso a toda una 'ariedad de recursos mu+ distintos Esto es posible por!ue se definen una serie de funciones para mane&ar un sistema de fic"eros %en5rico En *ni$ cada sistema de fic"eros tiene asociado un sistema plano de fic"eros ,as estructuras pueden ser diferentes para cada tipo de sistema de fic"eros. pero las funciones !ue lo mane&an !uedan unificadas por el (VN() Es!r#c!#ra es!an ar el sis!ema e 5ic+eros e Lin#, E$iste un documento -fsstnd- donde se describe una recomendacin para estandari#ar la estructura del sistema de fic"eros de ,inu$ para las distintas distribuciones Nosotros 'amos a resumir bre'emenente la informacim ms importante *n detalle ma+or sera necesario si este curso fuera un curso de administracin del sistema Este ltimo captulo no e$plica conceptos nue'os pero ser'ir para !ue comprenda lo !ue tiene en su sistema Puede in'esti%ar todo lo !ue !uiera por su cuenta siempre !ue use un usuario normalito sin pri'ile%ios (i al%una 'e# se siente perdido solo tiene !ue introducir el comando -cd- para 'ol'er a casita Puede "aber diferencias importantes en la estructura %eneral del sistema de fic"eros entre unas distribuciones + otras pero en lineas %enerales el aspecto de la disposicin de los directorios ms importantes sera ms o menos el si%uienteS
+ 700 700 700 700 700 700 700 700 7 7 700 7 7 7 7 7 7 700 700 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 700 bin sbin tmp boot dev etc home lib 700 mod"les =00 sec"rity home 700 'tp 700 httpd 700 l"is 700 ms#l 700 pili =00 s>eleton root "sr 700 bin 700 sbin 700 9@@R; 7 700 bin 7 700 incl"de 7 700 lib 7 =00 man 700 local 7 700 bin 7 700 doc 7 700 man 7 700 lib 7 700 src 7 =00 tmp 700 doc 700 incl"de 700 in'o =00 src =00 lin"x proc

=00 var 700 700 700 700 700 700 700 700 7 7 7 7 =00

cache catman lib local loc> lo& r"n spool 700 cron 700 lpd 700 mail =00 m#"e"e tmp

(i obser'a diferencias con la estructura de fic"eros de su distribucin no debe preocuparse esto es solo un e&emplo Comentaremos el cometido de los directorios ms si%nificati'os El irec!orio rai> Para arrancar el sistema. debe estar presente lo suficiente como para montar -8usr- + otras partes noG esenciales del sistema de arc"i'os Esto inclu+e "erramientas. informacin de confi%uracin + del car%ador de arran!ue (boot loader) + al%una otra informacin esencial al arrancar Para "abilitar la recuperacin +8o la reparacin del sistema. estar presente en el sistema de arc"i'os ra# a!uellas "erramientas !ue un administrador e$perimentado necesitara para dia%nosticar + reconstruir un sistema da6ado ,os errores del disco. !ue corrompen la informacin en el sistema de arc"i'os -8- son un problema ma+or !ue los errores en cual!uier otra particin *n sistema de arc"i'os -8- (rai#) pe!ue6o es menos propenso a corromperse como resultado de un fallo del sistema ,a principal preocupacin !ue se usa para balancear las anteriores consideraciones. !ue fa'orecen el colocar muc"as cosas en el sistema de arc"i'os ra#. es la de mantener -8- (rai#) tan pe!ueno como sea ra#onablemente posible
/ --- El Directorio Raz bin boot dev etc home lib mnt root sbin tmp "sr var Sinarios de comandos esenciales Archivos estFticos de car&ador de arran#"e?boot0loaderA Archivos de dispositivos Con'i&"raci)n del sistema local0mF#"ina Hirectorios home de los "s"arios TibrerNas compartidas !"nto de montaRe de particiones temporales Hirectorio ho&ar del "s"ario root Sinarios del sistema esenciales Archivos temporales <e&"nda Rerar#"Na mayor -n'ormaci)n variable

La 2erar8#?a =#sr: -8usr- es la se%unda ma+or seccin del sistema de arc"i'os -8usr- es informacin compartible. de solo lectura. esto si%nifica !ue -8usr-. debe ser compartible entre 'arias ma!uinas !ue corren ,@N*] + no se debe escribir Cual!uier informacin !ue es local a una m!uina o 'ara con el tiempo. se almacena en otro lu%ar Nin%n pa!uete %rande (como Te] o =N*Emacs) debe utili#ar un subdirectorio directo ba&o -8usr-. en 'e#. debe "aber un subdirectorio dentro de -8usr8lib- (o -8usr8local8lib- si fu5 instalado completamente local) para ese propsito. con el sistema ] Mindo> se "ace una e$cepcin debido a un considerable precedente + a la prctica ampliamente aceptada
/usr --- Segundo mayor punto de montaje (permanente)

9@@R; <istema 9 \indow Version @@ release ; 93:; <istema 9 \indows Version @@ release E en plata'ormas 9 :; bin Ta mayorNa de los comandos de "s"ario dict Tistas de palabras doc Hoc"mentaci)n miscelFnea etc Con'i&"raci)n del <istema ?todo el siteA &ames ]"e&os y binarios ed"cacionales incl"de Archivos header incl"idos por pro&ramas C in'o Hirectorio primario del sistema X.L -n'o lib TibrerNas local ]erar#"Na local ?vacNa R"sto desp"1s de la instalaci)n principalA man Kan"ales en lNnea sbin Sinarios de Administraci)n del <istema .o0Vitales share -n'ormaci)n independiente de la ar#"itect"ra src C)di&o '"ente

=#sr=local: @erar8#?a local ,a &erar!ua -8usr8local- est para ser utili#ada por el administrador del sistema cuando se instale el soft>are localmente Necesita estar a sal'o de ser sobreescrito cuando el soft>are del sistema se actuali#a Puede ser usado por pro%ramas + por informacin !ue son compartibles entre un %rupo de m!uinas . pero no se encuentran en -8usr/usr/local bin doc etc &ames lib in'o man sbin scr Jerarqua local. Sinarios solo0locales Hoc"mentaci)n local Sinarios de con'i&"raci)n solo0local ]"e&os instalados localmente TibrerNas para M"srMlocal !F&inas de in'o local ]erar#"Nas de pF&inas de man"al para M"srMlocal Administraci)n del sistema solo0local C)di&o '"ente local+

Este directorio debe estar 'aco al terminar de instalar ,@N*] por primera 'e# No debe "aber e$cepciones a la re%la . e$cepto !ui# los subdirectorios 'acos listados La @erar8#?a =0ar El sistema necesita con frecuencia una #ona de traba&o temporal (i solo se re!uiere usar un espacio por un corto periodo de tiempo se puede usar -8tmp-. pero muc"as 'eces la informacin con'iene mane&arla + almacenarla en un lu%ar ms permanente El sistema puede sufrir una caida repentina + el contenido de -8tmp- puede ser borrado durante el arran!ue o depurado re%ularmente mediante al%na tarea peridica Por el contrario -8'ar- contiene todo tipo de informacin al%una de ella puede ser importante Por e&emplo informacin 'ital para el mantenimiento de la %estin de pa!uetes de la distribucin o mensa&es pendientes de ser en'iados por correo. arc"i'os + directorios en fila de e&ecucin. informacin de bitcora administrati'a + arc"i'os temporales + transitorios aun!ue se asume !ue su permanencia ser ma+or !ue -8tmp/ ar !n"ormaci#n catman lib local loc> lo& named nis preserve r"n spool tmp aria$le !F&inas del man"al 'ormateadas localmente -n'ormaci)n del estado de aplicaciones -n'ormaci)n variable del so'tware de M"srMlocal Archivos de blo#"eo Archivos de bitFcora Archivos H.<* solo red Archivos base de datos .-< Archivos almacenados desp"1s de "na 'alla de ex o vi Archivos relevantes a procesos eRec"tFndose Hirectorios de trabaRos en 'ila para reali(arse desp"1s Archivos temporales* "tili(ado para mantener Mtmp

pe#"eWo

Tenemos una e$celente noticia para sus neuronas En este captulo no introduciremos conceptos nue'os ,e proporcionaremos una lista alfab5tica de comandos !ue puedan resultarle de utilidad Entre estos comandos no encontrar comandos internos de la s"ell. ni comandos relacionados con la pro%ramacin o administracin de su sistema (olo incluiremos los comandos de usuario de uso ms frecuente En el tema de comunicaciones solo mencionaremos unos pocos comandos bsicos Nos limitaremos a indicar bre'emente para !ue se usan En al%unos de ellos pondremos al%n e&emplo pero los detalles tales como forma de uso + opciones deben consultarse en el manual El ob&eti'o es simplemente !ue cono#ca la e$istencia de los comandos !ue pueden resultarle de ma+or utilidad en este momento ;ecuerde !ue un nmero entre par5ntesis a continuacin de un comando indica el nmero de seccin en el man Dado !ue no 'amos a mencionar en este momento nin%n comando interno del interprete de comandos bas" lo !ue si podemos indicarle es la forma de saber cuales son + como obtener informacin sobre cual!uiera de ellos <astar con teclear el comando -"elp- (i !uiere obtener ms informacin sobre cual!uiera de ellos teclee -"elp comandoE&emplo1
$ help 7 less $ help cd

Di&imos !ue no e$plicaramos nin%n comando interno pero en realidad -"elp- es un comando interno + tenemos !ue a6adir !ue admite el uso de meta caracteres
$ help help $ help 4alias

No se 'a a estudiar en detalle nin%n comando en este captulo +a !ue se trata de tener una 'isin de con&unto Por ello cuando lle%uemos a un comando !ue mere#ca ser e$plicado con ma+or profundidad nos limitaremos a decir para !ue sir'e + le de&aremos con la miel en los labios con un oportuno ?(e estudiar ms adelante? (eleccin de los comandos e$ternos de usuario ms tiles apropos at at! atrm awk banner batc" bc cal cat c"%rp c"mod c"o>n cksum clear cp cpio cut date df diff du ec"o egrep emacs en' e$ e$pr false fgrep file find fin%er free ftp fuser gawk grep %#ip "ead "ostname id info ispell kill killall less ln locate lp! lprm ls mail man mkdir more m' nice no"up pass>d paste pr ps pstree p>d renice reset rm rmdir rs" script sed sleep sort split stt+ su tail talk tee telnet test tload top tr true vi > >c >"atis >"ereis >"o >"oami >rite $ar%s #cat #diff #%rep #less #more ,os comandos a>k. cpio. e%rep. f%rep. find. %a>k. %rep. sed. sort. test. + 'i sern tratados en detalle en captulos posteriores apropos%(' Xa comentamos este comando en el captulo dedicado al manual online de uni$ (ir'e para a+udar a locali#ar un comando !ue no sabemos e$actamente como se escribe (olo se usa para la bs!ueda la

descripcin corta !ue fi%ura al principio de la p%ina del manual + "a+ !ue usar palabras completas + no secuencias de caracteres Por e&emplo si nuestro manual est en in%les podramos buscar compresores con1
$ apropos compress

a!%(' (e utili#a para pro%ramar un comando para !ue se e&ecute en un determinado momento Este comando no admite inter'alos de tiempo menores a un minuto ,a salida deber estar rediri%ida +a !ue se e&ecutar en se%undo t5rmino sin un terminal asociado *na 'e# e&ecutado este comando de'uel'e un nmero de tarea + el momento en el cual se acti'ar el comando E&emplos1
$ $ $ $ $ echo echo echo echo echo $date / MtmpMsalida$ 7 at now 2 @ min"te $date / MtmpMsalida$ 7 at :V@Eam <at"rday $date / MtmpMsalida$ 7 at noon $echo 'eli( aWo n"evo / MdevMconsole$ 7 at @@VED Hec 3@ $banner a comer / MdevMconsole$ 7 at @VEEpm

a!8%(' Permite 'er la cola de tareas pendientes


$ at#

a!rm%(' Permite cancelar una tarea pro%ramada + pendiente de e&ecutarse ms tarde


$ atrm @::

a<&%(' (e trata de un pro%rama !ue implementa un len%ua&e para tratar fic"eros de te$to estructurados en campos + re%istros Es mu+ potente + se estudiar ms adelante banner%(' Para %enerar cabeceras con letras %randes E&emplo1
$ banner hola

ba!c+%(' Es un comando mu+ similar al comando at pero no re!uiere la indicar el momento en ese caso se

e&ecutar en un momento con ba&a car%a E&emplo1


$ echo $date / MdevMconsole$ 7 batch

bc%(' Es una calculadora de precisin arbitraria (Es decir con toda la precisin !ue uno !uiera) (e puede usar interacti'amente o admitir comandos por la entrada estndar 2dmite e$presiones bastante comple&as + sentencias condicionales + de repeticin !ue constitu+en un potente len%ua&e de pro%ramacin para esta calculadora Por e&emplo calcular el nmero P@ con LDD cifras decimales
$ echo Oscale=3BBP C4a?@AO 7 bc 0l 3+@C@ED8;E3E:D3D383:C;8;C33:383DEB8::C@D3@;D3DD33E@BE:8BD3CDCCED83B3Q :@;CB;8:;8B:DD:;8:B3C:8E3C8@@3B;3D:8@C:B:;E@38:83B;;C3BD3:CC;BDEEBE:Q 883@38E3EDCB:@8:C:@@@3CEB8:C@B83B@D3:E8@@BEEED;CC;88DC:DECD3B3:@D;CCQ 8::@BD3E;;ED33CC;@8:C3E;C:8333:;3:3@;E83@8B@DBD@CE;C:E;;D83C;B3C:;@BQ CEC38;;C:8@33D3;B38;B8CD@C@838

cal%(' Calendario E&empos1


$ cal $ cal 8BBB

ca!%(' ,ee uno o ms fic"eros + los saca por la salida estndar


$ cat 'ichero@ 'ichero8 / 'ichero@_mas_8

c+/rp%(' Permite cambiar el atributo de %rupo de uno o ms fic"eros (olo el propietario del fic"ero o un usuario pri'ile%iado puede usarlo c+mo %(' Permite el cambio de los permisos asociados a un fic"ero (olo el propietario del fic"ero o un usuario pri'ile%iado puede usarlo
$ $ $ $ chmod chmod chmod chmod 2r MtmpM'ich "2r MtmpM'ich 33B MtmpM'ich a0wx*a2r MtmpM'ich

c+o<n%(' Permite cambiar el propietario actual de un fic"ero (olo el propietario del fic"ero o un usuario

pri'ile%iado puede usarlo Tambien permite cambiar el %rupo


$ chown "s"ario 'ichero $ chown "s"arioV&r"po 'ichero

c&s#m%(' )btiene un cdi%o (C;C) !ue est dise6ado para detectar 'ariaciones en la informacin por problemas en la %rabacin o transmisin de datos
$ c>s"m 'ichero

clear%(' ,impia el contenido de la consola cp%(' Copia fic"eros (i se utili#a con un par de ar%umentos tomar el inicial como ori%en + el final como destino (i el se%undo ar%umento es un fic"ero entonces sobreescribir su contenido (i se usa con ms de un ar%umento el ltimo "a de ser obli%atoriamente un directorio
$ cp 'ich@ 'ichdest $ cp 'ich@ dirdest $ cp 'ich@ 'ich8 'ich3 dirdest

cpio%(' 2dmite una lista de nombres de fic"eros para empa!uetarlos en un solo fic"ero Es un comando mu+ potente + 'erstil dunto con tar se usa entre otras cosas para "acer copias de se%uridad (uele usarse muc"o en combinacin con find ,o estudiaremos ms adelante c#!%(' Permite e$traer columnas o campos desde uno o ms fic"eros
$ c"t 0dV 0'@ MetcMpasswd $ c"t 0dV 0'; MetcMpasswd

a!e%(' )btiene la fec"a ,as opciones permiten obtener distintos formatos de salida

$ date dom R"n @@ @:V@3V@C CE<I 8BBB $ date 2O^JM^mM^d ^IO 8BBBMB;M@@ @:V@;VCD $ date 2^s D;B3CB8:3

5%(' @nforma de la utili#acin de disco en las particiones !ue estn montadas


$ d' 0a

i55%(' (ir'e para locali#ar diferencias entre dos fic"eros de te$to


$ di'' 'ich@ 'ich8

#%(' Permite a'eri%uar la ocupacin de espacio de todo a!uello !ue cuel%a de un determinado directorio Este comando con'iene usarlo de 'e# en cuando para locali#ar directorios demasiado car%ados de informacin
$ d" 0s + $ d" + $ d" 0s 4 7 sort 0n

ec+o%(' Permite sacar mensa&es por salida estndar e/rep%(' Es una 'ariedad del comando %rep !ue permite el uso de e$presiones re%ulares e$tendidas (ir'en para buscar cadenas de te$to o secuencias de caracteres en fic"eros (e estudiarn ms adelante emacs%('

Es un editor multipropsito en0%(' )btiene la lista de 'ariables de entorno + sus 'alores e,%(' Es un editor interacti'o similar al 'i En ,inu$ e$iste una 'ersin me&orada llamada el'is e,pr%(' Es un e'aluador de e$presiones
$ expr Q? EE 2 3@ QA M 3 8:

5alse%(' (olo tiene sentido usarlo en pro%ramacin + retorna un cdi%o de retorno !ue indica error En otras palabras no solo no "ace nada sino !ue adems siempre lo "ace mal Parece absurdo pero tiene su utilidad (i no fuera s no e$istira + no es el nico comando de este tipo 5/rep%(' Es una 'ariedad del comando %rep (ir'en para buscar cadenas de te$to o secuencias de caracteres en fic"eros (e estudiarn ms adelante 5ile%(' (ir'e para a'eri%uar el tipo de fic"ero pasado como ar%umento Distin%ue muc"os tipos de fic"eros
$ 'ile 'ich $ 'ile dir@ 'ich8

5in %(' Permite locali#ar fic"eros dentro de la estructura de directorios Es tremendamente 'erstil + se estudiar ms adelante
$ 'ind Mvar 0name $4+lo&$

5in/er%(' (ir'e para a'eri%uar !uien est conectado al sistema

$ 'in&er $ 'in&er 0l

5ree%(' Proporciona estadsticas de uso de la memoria del sistema 5!p%(' Comando para intercambiar fic"eros entre distintos ordenadores 5#ser%(' @ndica !ue proceso est usando un fic"ero o un directorio
$ '"ser M

/a<&%(' Es la 'ersin =N* de a>k (e trata de un pro%rama !ue implementa un len%ua&e para tratar fic"eros de te$to estructurados en campos + re%istros Es mu+ potente + se estudiar ms adelante /rep%(' dunto a e%rep. f%rep + r%rep sir'en para buscar cadenas de te$to o secuencias de caracteres en fic"eros (e estudiarn ms adelante />ip%(' Compresor desGcompresor de %nu (e puede usar directamente sobre un fic"ero o por el contrario puede usarse como filtro Cuando se usa directamente sobre un fic"ero se modificar el nombre del fic"ero a6adiendo %# para indicar !ue est comprimido o se eliminar cuando sea descoprimido
$ $ $ $ $ ls 0l M / directorio_rai( &(ip directorio_rai( &(ip 0d directorio_rai(+&( &(ip % directorio_rai( / directorio_rai(+&( &(ip 0d % directorio_rai(+&( / directorio_rai(

+ea %(' Permite sacar las primeras lineas de un fic"ero +os!name%(' )btiene el nombre de la m!uina

i %(' De'uel'e informacin de identidad de a!uel !ue lo e&ecuta in5o%(' Es un lector de "iperte$to de =N* 7uc"os pro%ramas de =N* inclu+en documentacin en formato info ,os "iperte$tos son te$tos !ue inclu+en enlaces subGmens. + otros elementos !ue facilitan una lectura no secuencial Por e&emplo el "tml es otro formato de "iperte$to ispell%(' Es un comprobador orto%rfico !ue puede ser acoplado a di'ersos editores como por e&emplo al 'i E$isten diccionarios orto%rficos para distintos len%ua&es &ill%(' En'a una se6al a un proceso (e llama kill por!ue %eneralmente se usa para ?matar? procesos ;e!uiere !ue se cono#ca el identificador del proceso P@D &illall%(' Como el anterior pero permite pasar el nombre del comando + ?matar? a todos los procesos !ue ten%an ese nombre less%(' Es un pa%inador !ue puede usarse en sustitucin del pa%inador more
$ less 'ichero $ cat 'ichero 7 less

ln%(' Crea enlaces r%idos + enlaces simblicos !ue son cosas !ue +a "emos estudiado loca!e%(' Permite la locali#acin rpida de fic"eros en su sistema de fic"eros (e utili#a una base de datos !ue debe de ser actuali#ada re%ularmente mediante el comando updatedb Este ltimo lo reali#ar root cuando lo crea oportuno o me&or aun estar pro%ramado en el sistema para !ue se e&ecute peridicamente ,a idea es la si%uiente Para locali#ar un fic"ero se suele e&ecutar el comando find capa# de e$plorar todo el rbol del sistema de fic"eros pero esta operacin es mu+ costosa por!ue re!uiere abrir + cerrar cada uno de los directorios en los !ue busca informacin El comando updatedb "ace esto mismo pero %uardando el resultado de toda la e$ploracin en una base de datos mu+ compacta donde se puede buscar con enorme rapide# ,a des'enta&a es !ue la informacin de bs!ueda tendr cierta anti%cedad + !ue no se %uardan todos los atributos del fic"ero por lo !ue resulta imposible buscar usando criterios para esos atributos Por ello usaremos locate para ciertas bs!uedas aun!ue al%unas 'eces tendremos !ue usar find

lp8%(' @nforma sobre el estado de la cola de impresin 7uestra las tareas !ue estn el la cola su identificador num5rico. orden. tama6o + propietario lprm%(' Permite cancelar tareas de impresin usando el identificador num5rico obtenido con lp! ls%(' )btiene un listado de los fic"eros de un directorio Tiene una %ran cantidad de opciones mail%(' (e usa para en'iar un correo electrnico (u mane&o comparado con otros pro%ramas de correo electrnico no resulta mu+ ami%able pero no solo sir'e para usarlo en modo interacti'o (e le puede pasar por la entrada estndar el contenido de un mensa&e *na aplicacin de esto es !ue podemos coleccionar mensa&es cortos por e&emplo para suscribirse o deGsuscribirse de listas de correo
$ echo "ns"bscribe l0lin"x 7 mail maRordomo_calvo+teleco+"lp&c+es $ mail 0s "ns"bscribe debian0"ser0spanish0re#"est_lists+debian+or&a

man%(' Este fu5 el primer comando !ue se estudi en este curso + no nos cansaremos de recomendarle !ue se familiarice con el ,a informacin de estas p%inas del manual no suele resultar mu+ didctica En ,inu$ no 'ienen apenas e&emplos 2 pesar de ello suele traer informacin completa de opciones + formas de uso m& ir%(' Crea uno o ms directorios ,os permisos dependern de el 'alor actual de -umask- Esto +a lo 'imos en captulos anteriores Para eliminar un directorio se usar -rmdir$ m>dir dir@ dirAMdirSMdirCMdir8 dir3

more%(' Es un pa%inador muc"o ms sencillo !ue el sofisticado -less$ ls 7 more $ more 'ichero

m0%('

(e utili#a para renombrar directorios + fic"eros o para trasladarlos de un lu%ar a otro Con'iene usarlo con precaucin por!ue se presta a obtener resultados diferentes en funcin de la e$istencia o no de un fic"ero o directorio de destino 7o'er un fic"ero a otro !ue +a e$iste supondra sobreescribirlo as !ue un error puede pro'ocar perdida de informacin Cuando se usan ms de dos ar%umentos en ,inu$ se obli%a a !ue el ltimo sea un directorio de destino lo cual pre'iene errores
$ mv 'ich@ 'ichB@ $ mv dir@ dirB@ $ mv 'ich@ 'ich8 dir@ dir8 'ich3 'ichC

dirBB@

nice%(' 2 un usuario normal le permitir ba&ar la prioridad de los proceso lan#ados con este comando (olo root puede usarlo para aumentar la prioridad *na 'e# !ue un comando "a sido lan#ado se puede modificar su prioridad con renice
$ nice comando

no+#p%(' ,os comandos lan#ados con no"up no terminan al abandonar la sesin (e puede usar combinado con la e&ecucin en back%round
$ noh"p Xenera-n'ormeKens"al / in'ormeB@0BE08BBB+o"t ` $ lo&o"t $ exit

pass< %(' Permite cambiar nuestra cla'e de acceso al sistema Con'iene no ol'idar la cla'e =eneralmente para e'itar ol'idos los usuarios eli%en cla'es demasiado sencillas Dependiendo del ni'el de se%uridad confi%urado en el sistema. este podra rec"a#ar cla'es demasiado sencillas No con'iene usar cla'es cortas ni palabras !ue puedan ser locali#adas en un diccionario ni fec"as o nombres relacionadas con datos de alto si%nificado personal Palabras escritas al re'5s tampoco son se%uras @ntercalar al%n carcter de puntuacin al%una ma+scula o al%n d%ito suele ser una buena prctica foToS43 pon B mar aliGb;os <ueno si el ordenador es de uso personal + solo tienen acceso personas de confian#a tampoco "a+ !ue ser demasiado paranoico pas!e%(' (e usa para combinar columnas de distintos fic"eros en uno solo Viene a ser lo contrario del comando cut
$ who 7 paste 0 0

pr%(' Permite pa%inar un te$to incorporando cabeceras

$ ls M4M4 7 pr 0h eRemplo0pr 0o E 0l 3E 7 less

ps%(' Permite obtener informacin de los procesos en e&ecucin Dependiendo lo !ue nos interese e$isten di'ersas opciones para una %ran 'ariedad de formatos + de seleccin de la informacin de salida ps!ree%(' 7uestra la &erar!ua entre procesos mostrando las relaciones de parentesco entre ellos
$ pstree $ pstree 0p

,a opcin Gp es mu+ til para a'eri%uar el pid de un proceso p< %(' Este comando retorna el lu%ar donde nos encontramos
$ pwd

(e puede usar por e&emplo para %uardar el lu%ar donde estamos a"ora con ob&eto de retornar ala mismo lu%ar ms tarde
$ $ $ $ AaL-==pwd= cd Mtmp ls cd $AaL-

renice%(' Es parecido a nice pero acta sobre un proceso !ue +a fue arrancado con anterioridad Por e&emplo "emos lan#ado un proceso !ue consume muc"os recursos + lle'a muc"o tiempo En lu%ar de pararlo podemos ba&arle la prioridad para !ue %aste muc"os recursos (Cuando decimos recursos nos referimos a uso de memoria. uso de CP*. etc) *n super usuario como root puede incrementar la prioridad usando un nmero ne%ati'o *n usuario normal solo podr decrementar la prioridad usando un nmero positi'o En cual!uier caso se re!uiere conocer el pid del proceso !ue deseamos modificar + solo podremos "acerlo si es un proceso nuestro Por e&emplo 'amos a suponer !ue el P@D de ese proceso !ue deseamos ba&ar de prioridad es el aaE
$ renice 2@E 33:

rese!%(' Puede ocurrir !ue el terminal !uede desGconfi%urado por al%una ra#n Esto se debe a !ue un terminal interpreta comandos en forma de secuencias de caracteres Esto permite mostrar colores mane&ar el cursor + una serie de cosas ms Cuando accidentalmente en'iamos al terminal un fic"ero binario !ue contiene caracteres de todo tipo en cual!uier orden. es bastante normal !ue el terminal !uede inutili#able 7uc"as 'eces se puede recuperar introduciendo el comando reset

rm%(' Xa "emos e$plicado + usado este comando (ir'e para borrar fic"eros rm ir%(' Xa "emos e$plicado + usado este comando (ir'e para eliminar directorios !ue deben de estar 'acos rs+%(' Permite siempre !ue ten%amos permiso e&ecutar un comando en un ordenador distinto (e puede usar para transferir %randes cantidades de informacin a tra'5s de la red Por e&emplo ima%inemos !ue !ueremos sacar una copia de se%uridad %uardando la informacin en una unidad de cinta !ue se encuentra en un ordenador distinto En ese caso se lan#an dos comandos simultneos comunicndolos con un pipe *n comando se e&ecutar en el ordenador remoto con rs" + el otro se e&ecuta en local 2mbos procesos !uedan comunicados por entrada salida pero eso implica !ue esa comunicacin 'ia&ar a tra'5s de la red
$ !ara salvar $ tar c' 0 + 7 rsh remotehost dd o'=MdevMtape $ !ara rec"perar $ rsh remotehost dd i'=MdevMtape 7 tar x' 0

,a forma de combinar comandos en uni$ conectando entrada salida permite "acer muc"as 'eces cosas sorprendentes como en este caso E$isten un comando similar !ue "ace lo mismo pero la informacin 'ia&a encriptada a tra'5s de la red (e trata de -ss"scrip!%(' Este es un comando realmente curioso (u utilidad principal es %rabar una sesin ,an#a una subs"ell !ue se e&ecutara en un pseudoGterminal Este palabro no deseamos e$plicarlo a"ora pero mientras estamos en esa subs"ell todos los caracteres recibidos por el terminal son %rabados en un fic"ero Para terminar se teclea e$it Es til para memori#ar sesiones de traba&o se %(' Este es un editor de flu&o Dic"o de otra forma es un editor !ue est pensado para usarlo como flu&o De esta forma se puede usar como una poderosa "erramienta para transformar te$to (e estudiar ms adelante sleep%(' (ir'e para esperar sin consumir recursos El proceso !ueda dormido durante el nmero de se%undos indicado
$ echo holaP sleep E P echo #"e tal

sor!%('

Este comando permite ordenar lineas de te$to (e puede usar como filtro (e estudiar ms adelante spli!%(' Este comando sir'e para partir en tro#os ms pe!ue6os un fic"ero %rande Para 'ol'er a obtener el fic"ero ori%inal bastar con usar el comando -cat$ split 00bytes=E8m 'ichero&rande parte

Este comando trocea fic"ero%rande en tro#os de B47b+tes !ue se %uardan en fic"eros !ue empie#an con el prefi&o -parte- se%uido de una numeracin secuencial s!!4%(' (ir'e para comprobar el estado actual del terminal + para cambiar la confi%uracin del mismo (e puede cambiar el si%nificado de al%unos caracteres de control. establecer el nmero de filas + columnas del terminal. la 'elocidad de transmisin. etc Para comprobar el estado actual teclee lo si%uiente
$ stty 0a

s#%(' Permite cambiar de usuario ,o !ue se "ace es lan#ar una subs"ell /a+ dos formas de "acerlo -su nue'ousuario- + -su G nue'ousuario- (i no usamos la se%unda forma solo cambiar el usuario efecti'o pero el entorno del proceso se mantiene (i por el contrario se usa la se%unda forma se e&ecutarn los scripts de inicio de sesin para el nue'o usuario + tendremos una sesin id5ntica a la obtenida con la entrada con lo%in para ese nue'o usuario Para terminar esa sesin bastar "acer e$it
$ s" n"evo"s"ario $ s" 0 n"evo"s"ario

Para un usuario normal se solicitar la pass>ord del nue'o usuario !ail%(' 2s como "ead ser'a para obtener las primeras lneas de un fic"ero tail sir'e para obtener las ltimas lneas de un fic"ero
$ tail 'ichero

Tail tiene una opcin mu+ til para mostrar !ue es lo !ue est pasando en fic"eros !ue se estn %enerando o !ue crecen continuamente
$ tail 0' 'ichero

Este comando no termina nunca + muestra el final del fic"ero !uedando a la espera de mostrar el resto de mismo a medida !ue se %enere Para terminar "a+ !ue matarlo con CtrlGC

!al&%(' Permite abrir una sesin de c"arla interacti'a con otro usuario !ee%(' Este comando se utili#a para obtener una bifurcacin en un flu&o de entrada salida 2cta como una deri'acin en forma de -T$ ll 7 tee todos0'ich 7 tail / "ltimos0'ich

!elne!%(' Permite abrir una sesin de traba&o en otra m!uina


$ telnet localhost

Con esto podemos probar telnet conectndonos con nuestra propia m!uina 2 continuacin saldr la solicitud de lo%in !es!%(' (e usa para e'aluar e$presiones (e usa muc"o en la pro%ramacin s"ellGscript ,o !ue se usa es su cdi%o de retorno Tiene dos formas de uso -test e$presin- o -_ e$presin `$ test O8O = O3O $ echo $[ $ test O8O = O8O $ echo $[ $ A=33E $ S=33E $ 5 O$AO = O$SO 6 $ echo $[

(e estudiar ms adelante !loa %(' Con'ierte el terminal en un monitor semiG%rfico !ue indicar el ni'el de car%a del sistema (e interrumpe con CtrlGC (i el sistema no est traba&ando demasiado no 'er nada demasiado interesante
$ ls M4M4 / MdevMn"ll 8/`@ $ tload 0d 8 `

!op%(' 7uestra informacin de cabecera con estadsticas de uso de recursos (nmero de procesos + en !ue estado estn. consumo de CP*. de memoria. + de s>ap) 2dems muestra informacin mu+

completa sobre los procesos !ue estn consumiendo ms recursos (i el ordenador 'a mu+ lento por e$ceso de traba&o podemos "acernos una idea mu+ buena de los moti'os usando este comando En realidad este comando es mu+ til para el administrador del sistema pero los usuarios !ue comparten el uso de un sistema con otros usuarios tambi5n tienen !ue usar los recursos del sistema de forma inteli%ente ba&ando la prioridad de tareas poco ur%entes + !ue consuman muc"o En especial no resulta buena idea lan#ar muc"as tareas pesadas de forma simultanea aun!ue sean ur%entes por!ue se per&udica el rendimiento %lobal del sistema !ue %astar e$cesi'o tiempo en labores improducti'as de %estin de procesos
$ top

Para salir "a+ !ue pulsar -!!r%(' (e utili#a para sustituir carcter
$ !asar a mayGsc"las $ tr $5a0(6$ $5A0U6$ % 'ichero / n"evo'ichero $ Eliminar el carFcter $V$ $ tr 0d V % 'ichero / n"evo'ichero

!r#e%(' Este comando es el contrario del comando -false- (olo tiene sentido usarlo en pro%ramacin + retorna un cdi%o de retorno !ue indica 5$ito En otras palabras no "ace pero al menos lo "ace correctamente 0i%(' Este es un editor mu+ potente + presente en todos los sistemas de tipo *ni$ (e estudiar ms adelante <%(' 7uestra informacin de usuarios actualmente conectados mostrando momento de inicio de sesin + el consumo de CP* !ue se "a reali#ado
$ w

<c%(' Este es un comando !ue se usa bastante (ir'e para contar caracteres. palabras + lineas en un fic"ero o en un flu&o de entrada salida
$ wc 'ichero $ cat 'ichero 7 wc

<+a!is%(' (ir'e para mostrar la bre'e descripcin de un comando !ue fi%ura en las p%inas del manual
$ whatis ls $ whatis whatis

<+o%(' (aca la informacin de !uienes estn conectados al sistema


$ who

<+oami%(' Para a'eri%uar !uien es usted en ese momento En un pro%rama puede ser interesante comprobar !uien lo est e&ecutando
$ whoami

<+ereis%(' (ir'e para locali#ar un comando en el sistema siempre !ue este est5 locali#ado en 0P2T/
$ whereis ls $ whereis whereis

<ri!e%(' (iempre !ue se ten%a permiso permite en'iar mensa&es a otro usuario
$ write root

,ar/s%(' (ir'e para pasar ar%umentos a un comando mediante entrada salida


$ echo $0l$ 7 xar&s ls

Cosas como estas a6aden bastante potencia al len%ua&e s"ellGscript >::: /a+ una serie de comandos -#cat. #more. #%rep. #less. #diff- !ue permiten traba&ar directamente con fic"eros comprimidos con %#ip en la misma forma !ue lo "aramos directamente con -cat. more. %rep. less + diff- respecti'amente
$ (less doc"mento+txt+&(

EAP1ESIONES 1EGULA1ES

@ntroduccin )peradores usados en e$presiones re%ulares E&emplos para cada operador con -e%rep2mpliando conocimientos sobre -e%rep*so de e$presiones re%ulares en -sed2mpliando conocimientos sobre -sedTest

In!ro #ccin Vamos a e$plicar las e$presiones re%ulares por!ue se utili#an a menudo desde una %ran 'ariedad de aplicaciones en los () tipo *ni$ como ,inu$ Permiten reconocer una serie de cadenas de caracteres !ue obedecen a cierto patrn !ue llamamos e$presin re%ular Por e&emplo si deseamos buscar lineas !ue conten%a las palabras -"ola- o -adis- en los fic"eros del directorio actual "aremos1
$ e&rep $hola7adi)s$ 4

No todos los comandos usan de forma id5ntica las e$presiones re%ulares 2l%unos de los comandos !ue usan e$presiones re%ulares son -%rep-. -e%rep-. -sed-. -'i-. + -le$- Este ltimo en linu$ se llama -fle$- + es un anali#ador sintctico mu+ potente pero no lo e$plicaremos por!ue para usarlo "a+ !ue saber len%ua&e -C- 2ctualmente al%unos len%ua&es modernos como el -perl- inclu+en capacidad de mane&ar e$presiones re%ulares lo cual les da una %ran potencia + para len%ua&es ms anti%uos como el -C- e$isten libreras para poder usar e$presiones re%ulares En resumen las e$presiones re%ulares estn sinedo incorporadas en distintos sitios + +a no estn limitadas a su uso en () tipo *ni$ Cada comando o aplicacin implementa la e$presiones re%ulares a su manera aun!ue en %eneral son todas bastantes parecidas Por e&emplo -%rep- permite usar e$presiones re%ulares sencillas mientras !ue -e%rep- es capa# de usar e$presiones re%ulares ms comple&as )tros comandos adaptan el uso de e$presiones a sus particulares necesidades + por ello si bien se puede "ablar en %eneral de ellas "a+ !ue tener en cuenta las peculiaridades de cada caso !ue debern ser consultadas en las pa%inas del manual de cada comando ,as e$presiones re%ulares 'ienen a ser una especie de len%ua&e + cada comando usa su propio dialecto En realidad las diferencias entre los distintos dialectos suelen ser mu+ pocas Por e&emplo si un comando usa los par5ntesis + adems admite el uso de e$presiones re%ulares e$tendidas se establecer una forma de distin%uir si los par5ntesis deben ser interpretados como patrn de la e$presin re%ular o como otra cosa Para ello se suele usar los par5ntesis precedidos del carcter escape -:- Vamos a tomar a -e%rep- + -sed- como comandos para aprender e$presiones re%ulares por!ue este curso tiene un enfo!ue prctico *saremos el comando -e%rep- con distintos patrones + 'eremos cuando cumple + cuando no cumple + de esa forma se entender perfectamente Opera ores #sa os en e,presiones re/#lares: B C : D E F El elemento precedente debe aparecer D o ms 'eces El elemento precedente debe aparecer 3 o ms 'eces *n carcter cual!uiera e$cepto salto de linea )perador unario El elemento precedente es opcional ) uno u otro Comien#o de linea

G H:::I HF:::I . %:::' J Jn

Nin de linea Con&unto de caracteres admitidos Con&unto de caracteres no admitidos )perador de ran%o 2%rupacin Escape ;epresentacin del carcter fin de linea

;epresentacin del carcter de tabulacin J! Esta lista no es completa pero con esto es suficiente para "acer casi todo lo !ue normalmente se "ace con e$presiones re%ulares E2emplos para ca a opera or con Ke/repK Empe#aremos usando un e&emplo lo ms sencillo posible para ilustrar cada uno de estos operadores
$ % % % % % % % % @ 8 3 3 e&rep $ab4c$ %%,-. @ ac 8 aac 3 abbbc C axc E aaab ; cba 3 aacaa ,-. ac aac abbbc aacaa

E&emplo para el operador -Y- con el patrn -abYcEste patrn locali#ar las cadenas de caracteres !ue empiecen por -a-. !ue continen con D o ms -b-. + !ue si%an con una -c,a A falla por!ue la -a- + la -c- no 'an se%uidas ni e$isten caracteres -b- entre ambas ,a B falla por no tener una sola -c- + la C tiene los caracteres adecuados pero no en el orden correcto

E&emplo para el operador -R- con el patrn -abRcEste patrn locali#ar las cadenas de caracteres !ue empiecen por -a-. !ue continen con 3 o ms -b-. + !ue si%an con una -c(olo la lnea L cumple la e$presin re%ular

$ % % % % % % % %

e&rep $ab4c$ %%,-. @ ac 8 aac 3 abbbc C axc E aaab ; cba 3 aacaa ,-.

3 abbbc

E&emplo para el operador - - con el patrn -a cEste patrn locali#ar las cadenas de caracteres !ue empiecen por -a-. !ue continen con dos caracteres cuales!uiera distintos de salto de lnea + !ue si%an con una -c-

$ % % % % % % %

e&rep $a++c$ %%,-. aBBc axxcxx aacc abc ac axxxc ,-.

aBBc axxcxx aacc

E&emplo para el operador -P- con el patrn -abPcdEste patrn locali#ar las cadenas de caracteres !ue empiecen por -a-. + !ue opcionalmente continen con una -b- + !ue contine con los caracteres -cd-

$ % % % % %

e&rep $ab[cd$ %%,-. abcd acd cd abbcd ,-.

abcd acd

E&emplo para el operador -H- con el patrn -abHcdEste patrn locali#ar las cadenas de caracteres !ue conten%an -ab-. -cd-. o -34L-

$ % % % % % %

e&rep $ab7cd7@83$ %%,-. xxxab((( xxxcd>>> badc dbca x@83( ,-.

xxxab((( xxxcd>>> x@83(

E&emplo para el operador -b- con el patrn -babcEste patrn locali#ar las lineas !ue empiecen por -abc-

$ % % % %

e&rep $Yabc$ %%,-. abcde'&h abc xx BBabc ,-.

abcde'&h abc xx

E&emplo para el operador -0- con el patrn -abc0Este patrn locali#ar las lineas !ue terminen por -abc-

$ % % % % %

e&rep $abc$$ %%,-. abcd BBBabc xxabcx abc ,-.

BBBabc abc

E&emplo para el operador -_ `- con el patrn -D_abc`DEste patrn locali#ar las cadenas !ue ten%an un -Dse%uido de un carcter !ue puede ser -a-. -b-. o -c- + se%uido de otro -D-

$ % % % % % %

e&rep $B5abc6B$ %%,-. BabcB BaB BbB BcB xax ,-.

BaB BbB BcB

E&emplo para el operador -b- (ne%acin) dentro de -_ `con el patrn -D_babc`DEste patrn locali#ar las cadenas !ue ten%an un -Dse%uido de un carcter !ue no podr ser ni -a-. ni -b-. ni -c- + se%uido de otro -D-

$ % % % % % %

e&rep $B5Yabc6B$ %%,-. BabcB BaB BBB xBxBx BcB ,-.

BBB xBxBx

E&emplo para el operador -G- (ran%o) dentro de -_ `con el patrn -D_aG#`DEste patrn locali#ar las cadenas !ue ten%an un -Dse%uido de una letra minscula. + se%uido de otro -D-

$ % % % % %

e&rep $B5a0(6B$ %%,-. BaB BBB BUB xBxBx ,-.

BaB xBxBx

E&emplo para el operador -()- (a%rupacin) con el patrn -D(abc)PDEste patrn locali#ar las cadenas !ue ten%an un -Dse%uido opcionalmente de la secuencia abc. + se%uido de otro -D-

$ % % % % %

e&rep $B?abcA[B$ %%,-. hhBBhh sBabcBs sBabBs Babc ,-.

hhBBhh sBabcBs

E&emplo para el operador -:- (escape) con el patrn -D:(abc:)PDEste patrn locali#ar las cadenas !ue ten%an un -Dse%uido opcionalmente de -)-. + se%uido de otro -D-

$ % % % %

e&rep $BQ?abcQA[B$ %%,-. B?abcABxx B?abcBxx hhBBhh ,-.

B?abcABxx B?abcBxx

Amplian o conocimien!os sobre Ke/repK /emos aprendido cosas de e%rep para ilustrar el uso de las e$presiones re%ulares pero tanto %rep como e%rep permiten el uso de ciertas opciones !ue an no "emos comentado + !ue no 'amos a ilustrar con e&emplos por!ue no estn relacionadas con las e$presiones re%ulares (olo 'amos a se6alar las opciones ms tiles para !ue las cono#ca

Gi <usca i%norando diferencias entre ma+sculas + minsculas G> Para for#ar !ue la cadena reconocida sea una palabra completa Gl No muestra el contenido de la linea encontrada pero si !ue muestra el fic"ero !ue contiene la cadena buscada Esto es til cuando deseamos buscar entre muc"os fic"eros de los cuales al%unos son binarios por!ue la muestra del contenido de un fic"ero binario puede desconfi%urar el terminal Gn 7uestra el nmero de lnea dentro del fic"ero para a+udar a su locali#acin G' En lu%ar de sacar la lineas !ue cumplen la bs!ueda sacar las !ue no cumplen

Para un ma+or detalle consultar las p%inas del manual (e trata de un comando de %ran utilidad + le

recomendamos !ue practi!ue por su cuenta con el E$sten 'arias modalidades de este comando

%rep Comando bsico e%rep Versin %rep para uso de e$presiones re%ulares e$tendidas f%rep Versin %rep interpreta los patrones no como e$presiones re%ulares sino como cadenas de caracteres fi&as r%rep Permite buscar recursi'amente en 'arios fic"eros recorriendo un arbol de directorios

Uso e e,presiones re/#lares en Kse K 2"ora 'eremos unos e&emplos con -sed- Este comando es capa# de editar un flu&o o c"orro de caracteres lo cual es de enorme utilidad dado !ue muc"os comandos se comunican a tra'5s de entrada salida mediante c"orros de caracteres No podemos 'er todas las posibilidades de -sedpor!ue lo !ue nos interesa es su uso con e$presiones re%ulares Para ello usaremos un nue'o operador -T- !ue en la parte de substitucin de -sed- indica la parte !ue coincide con la e$presin re%ular Para usar -sed- se pone como primer ar%umento a continuacin del comando la orden adecuada )pcionalmente se puede poner un se%undo parmetro !ue indicara el nombre de un fic"ero De no e$istir ese se%undo parmetro esperar la entrada por la entrada estndar (e intentan reconocer las secuencias ms lar%as posibles b + 0 no consumen carcter -:n- si Empe#amos con una sustitucin sencillita
$ echo Oabc@83Cde'O 7 sed OsM5B0D65B0D64M.LKEROMO abc.LKEROde'

2"ora usamos el operador -T- )bser'e como se sustitu+e por el patrn reconocido
$ echo Oabc@83Cde'O 7 sed OsM5B0D65B0D64M%`/MO abc%@83C/de'

Despu5s eliminamos la secuencia num5rica


$ echo Oabc@83Cde'O 7 sed OsM5B0D65B0D64MMO abcde'

Vamos a comprobar !ue en las e$presiones re%ulares se intenta siempre reconocer la secuencia ms lar%a posible
$ echo OBBBx@@@x888x333O 7 sed OsMx+4xM%`/MO BBB%x@@@x888x/333

Vamos a"ora a traba&ar sobre un fic"ero Como siempre recordamos !ue traba&e con un usuario sin pri'ile%ios + dentro de 8tmp Xa sabe como "acerlo as !ue cambie a"ora a 8tmp antes de continuar Para suprimir del fic"ero la palabra -/ola- en las lineas de la L a la A

$ % % % % % % % $

Creamos "n 'icherito de pr"eba cat %%,-. / pr"eba0sed+txt Hola este es "n 'ichero con datos de pr"eba Hola otra ve(+ Hola otra ve(+ Hola otra ve(+ Hola otra ve( y otra y otra y otra y otra y otra+ ,in de los datos de pr"eba ,-. sed O3*CsMHolaMMO pr"eba0sed+txt

Hola este es "n 'ichero con datos de pr"eba Hola otra ve(+ otra ve(+ otra ve(+ Hola otra ve( y otra y otra y otra y otra y otra+ ,in de los datos de pr"eba

El fic"ero no "a cambiado El resultado sale por salida estndar 2"ora 'eamos !ue pasa si intentamos sustituir la palabra -otra- por la palabra -una- en todo el fic"ero
$ sed OsMotraM"naMO pr"eba0sed+txt Hola este es "n 'ichero con datos de pr"eba Hola "na ve(+ Hola "na ve(+ Hola "na ve(+ Hola "na ve( y otra y otra y otra y otra y otra+ ,in de los datos de pr"eba

Vemos !ue solo se "a cambiado la primera ocurrencia de cada lnea Para obtener el resultado deseado tendramos !ue usar la % al final
$ sed OsMotraM"naM&O pr"eba0sed+txt Hola este es "n 'ichero con datos de pr"eba Hola "na ve(+ Hola "na ve(+ Hola "na ve(+ Hola "na ve( y "na y "na y "na y "na y "na+ ,in de los datos de pr"eba

Amplian o conocimien!os sobre Kse K /emos aprendido cosas de sed para ilustrar el uso de las e$presiones re%ulares pero sed tiene muc"as ms posibilidades !ue an no "emos comentado Comentaremos solo al%o ms pero sin e$tendernos demasiado En sed se pueden especificar 'arias instrucciones separando con -S- cada una de ellas o usando la opcin Ge antes de cada instruccin Tambi5n podemos apro'ec"ar el se%undo introductor de la s"ell
$ sed OsMotraMve(M& P sMve(Mpe(M&O pr"eba0sed+txt Hola este es "n 'ichero con datos de pr"eba Hola pe( pe(+ Hola pe( pe(+ Hola pe( pe(+ Hola pe( pe( y pe( y pe( y pe( y pe( y pe(+ ,in de los datos de pr"eba -d1ntico res"ltado podrNamos haber conse&"ido "sando $ sed 0e OsMotraMve(M&O 0e OsMve(Mpe(M&O pr"eba0sed+txt Lna tercera 'orma para conse&"ir lo mismo $ sed O % sMotraMve(M& % sMve(Mpe(M& % O pr"eba0sed+txt

Tambi5n podemos obtener el mismo resultado usando la opcin Gf + un fic"ero de instrucciones para -sed$ cat %%,-. / pr"eba0sed+sed % sMotraMve(M& % sMve(Mpe(M& ,-. $ sed 0' pr"eba0sed+sed pr"eba0sed+txt

E$isten posibilidades ms a'an#adas para usar -sed- pero con lo !ue "emos mencionado se pueden "acer muc"as cosas Podemos eliminar los blancos a principio + al final de linea as como sustituir mas de un blanco se%uido por un solo blanco
$ % % % % cat %%,-. / trim+sed sMY 4MM& sM 4$MM& sM 4M M& ,-.

(i necesita "acer al%una transformacin + no encuentra la forma facil de "acer con sed piense !ue !ui#s necesite usar 'arias transformaciones en cadena
bMbinMbash echo P echo ,iltraremos la salida del comando cal para #"e el dNa de hoy resalte enmarcada entre corchetes+ !rimero obtenemos el dNa del m1s H-AKE<==date $2^d$= Asi no vale+ Hay #"e eliminar los posibles ceros a la i(#"ierda obtenidos en la variable H-AKE<+ Lsamos para ello print'?@A H-AKE<==print' ^d $H-AKE<= Resaltar el dNa del m1s correspondiente al dNa de hoy* <i es el Gltimo dNa del mes ?patr)n $ 58365B0D6$$A aWadiremos "n blanco al 'inal y asN "saremos siempre como patr)n de s"stit"ci)n el dNa m1s ?$H-AKE<A entre dos caracteres blancos sin #"e eso provo#"e errores en el Gltimo diF del mes+ cal 7 head 0n @ cal 7 tail 0n 3 7 sed $sM M 2M&$ 7 sed $sMY M2M&$ 7 Q sed $sM M M&$ 7 sed $sM2M M&$ 7 sed $sM$M` M$ 7 Q sed $sMYM M$ 7 sed OsM $H-AKE< MQ5$cH-AKE<dQ6MO Ira(as cal 7 tee tra(a+@ 7 Q tail 0n 3 7 tee tra(a+8 7 Q sed $sM M 2M&$ 7 tee tra(a+3 7 Q sed $sMY M2M&$ 7 tee tra(a+C 7 Q sed $sM M M&$ 7 tee tra(a+E 7 Q sed $sM2M M&$ 7 tee tra(a+; 7 Q sed $sM$M` M$ 7 tee tra(a+3 7 Q sed $sMYM M$ 7 tee tra(a+: 7 Q sed OsM $H-AKE< MQ5$cH-AKE<dQ6MO / tra(a+D

,as ltimas lneas las "emos a6adido simplemente para anali#ar paso a paso como se 'a transformando la salida ori%inal del comando cal del cual en primer lu%ar +a "emos separado la primera lnea ,as distintas etapas !uedan re%istradas en tra#a 3 a tra#a E

tra(a+@ contiene la salida del comando cal+ < 3 @C 8@ 8: K @ : @E 88 8D April 8BB8 I" \ Ih , < 8 3 C E ; D @B @@ @8 @3 @; @3 @: @D 8B 83 8C 8E 8; 83 3B

En tra(a+8 se ha eliminado la primera lNnea+ < 3 @C 8@ 8: K @ : @E 88 8D I" \ Ih , < 8 3 C E ; D @B @@ @8 @3 @; @3 @: @D 8B 83 8C 8E 8; 83 3B

En tra(a+3 se ha s"stit"ido toda sec"encia de dos blancos por $ 2$ < 2 3 @C 8@ 8: 2K 2@ 2: @E 88 8D I" 28 2D @; 83 3B 2\ 23 @B @3 8C Ih 2C @@ @: 8E 2, 2E @8 @D 8; 2< 2; @3 8B 83

En tra(a+C s"stit"imos los blancos a comien(o de lNnea por $2$ 2< 22 23 @C 8@ 8: 2K 2@ 2: @E 88 8D I" 28 2D @; 83 3B 2\ 23 @B @3 8C Ih 2C @@ @: 8E 2, 2E @8 @D 8; 2< 2; @3 8B 83

Xracias a los pasos anteriores ya tenemos "na estr"ct"ra de lNneas 'ormada por dos caracteres distintos de blanco separadas por "n blanco y precisamente este blanco en tra(a+E lo s"stit"imos por dos blanco para dar ensanchar toda la salida+ 2< 22 23 @C 8@ 8: 2K 2@ 2: @E 88 8D I" 28 2D @; 83 3B 2\ 23 @B @3 8C Ih 2C @@ @: 8E 2, 2E @8 @D 8; 2< 2; @3 8B 83

Ahora ya no son Gtiles los $2$ y los s"stit"imos por blancos+ En tra(a+; ya tenemos la salida ensanchada+ < 3 @C 8@ 8: K @ : @E 88 8D I" 8 D @; 83 3B \ 3 @B @3 8C Ih C @@ @: 8E , E @8 @D 8; < ; @3 8B 83

En tra(a+3 no se aprecia la di'erencia pero si #"e existe+ cal termina las lNneas inmmediatamente desp"es del nGmero* y no hay ra()n para #"e lo ha&a de otra manera pero a nosotros nos conviene #"e absol"tamente todos los nGmeros ten&an "n blanco a la i(#"ierda

@ndependientemente de !ue a usted se le ocurra otra solucin me&or. se trataba de practicar con sed + con siete seds encadenados pensamos !ue +a "abr saciado su sed de sed(3) De todas formas si lo !uiere ms bonito + cortito pruebe esto otro
E<C==echo 0e OQB33O= cal 7 sed OsM$M` MO 7 sed OsM $H-AKE< M $E<C5@m$cH-AKE<d$E<C5Bm MO

Xa nos salimos del tema pero si esto "a despertado su curiosidad mire consoleJcodes(A)

EL E"ITO1 VI %primera par!e'


@ntroduccin -ed- 'ersus -'i-'im- 'ersus -'iCuadro resumen para el uso de -'iPracticando lo ms esencial de -'i;ecuperar la informacin perdida por muerte prematura del editor Test

In!ro #ccin En primer lu%ar 'amos a dedicar bastante esfuer#o a e$plicar por!ue aprender -'i- 9ui#s pens !ue este captulo no era para usted por!ue +a sabe usar otro editor Tambi5n 'amos e$plicar la necesidad de dedicar dos lar%os captulos a este editor Cuando finalice este captulo podr editar sus fic"eros con -'i- + "acer bastante traba&o til pero para ello !ui#as necesite al%o ms de esfuer#o !ue en captulos anteriores + no por!ue sea dificil sino por!ue tendr !ue practicar bastante por su propia cuenta )tra cosa ser sacarle el m$imo partido a -'i- En un se%undo captulo dedicado a -'i- 'eremos opciones ms a'an#adas (on opciones !ue !ui#s no necesite usar tan frecuentemente pero cuando ten%a oportunidad de usarlas comprender la potencia el editor -'i7uc"os editores actuales permiten usar distintos tipos de letras + %eneran documentos con un aspecto precioso !ue adems coincide lo !ue se 'e en pantalla cuando se edita. + con lo !ue saldr por la impresora Est claro !ue -'i- no sir'e para esto -'i- est dise6ado para editar fic"eros en formato de te$to estndar Pero aun!ue solo sir'a para este formato de te$to lo "ace mu+ bien + siempre tendremos oportunidad de usarlo por!ue a un compilador. o a un interprete le da i%ual la est5tica (on muc"os los editores disponibles en ,inu$ pero desde un principio di&imos !ue este curso podra ser'ir en %ran medida para aprender otros () tipo *ni$ El editor -'i- est presente desde "ace muc"o tiempo en un montn de sistemas tipo *ni$ 2!u e$plicaremos solo unos pocos aspectos de -'i- con la idea de !ue pueda reali#ar con ra#onable soltura la edicin de un te$to en -'i- Con mu+ pocos comandos de -'i- se pueden "acer muc"as cosas + -'i- es un editor !ue para ciertas tareas resulta de una potencia increble El !ue escribe estas lineas lo est "aciendo con -'i- + lle'a muc"os a6os usando este editor prcticamente para casi todo + le saco un %ran partido. pero cada 'e# !ue me encuentro con al%ui5n !ue sabe bastante de -'i- aprendo al%o nue'o -'i- es un editor mu+ prctico sin tener !ue conocerlo a fondo pero en manos de un e$perto resulta de una eficacia espectacular -'i- es un editor de lineas interacti'o + "a sido mu+ criticado *na de las ra#ones para ello es !ue tiene 'arios estados o formas de funcionamiento + si uno pasa de un estado a otro sin darse cuenta + continua tecleando cosas. puede ocurrir un pe!ue6o destro#o en el fic"ero !ue est editando )tro incon'eniente de -'i- es !ue re!uiere un po!uito de aprendi#a&e /a+ muc"sima %ente !ue est acostumbrada a usar otros editores ms intuiti'os + por!ue no decirlo ms cmodos. + rec"a#an a

-'i- como al%o pre"istrico )tra cosa !ue suele criticarse es !ue se usan letras del teclado para cosas tan normales como el mo'imiento del cursor + la pa%inacin del te$to pero este es un claro e&emplo del condicionamiento de la cultura de 7icrosoft + de los PCs -'i- fue dise6ado para !ue se pudiera usar en una %ran 'ariedad de sistemas + terminales El uso de las teclas de flec"as puede lo%rarse mediante la adecuada confi%uracin de -'i- *no de los puntos fuertes de -'i- es su adaptabilidad 9ui#s una de las ms poderosas ra#ones para aprender -'i- es !ue -'i- forma parte de la cultura de los () tipo *ni$ 7uc"as personas acostumbradas a traba&ar por e&emplo con Mindo>s asumirn como estndar cosas !ue no lo son + cuando se encuentran al%o diferente intentan apro'ec"ar al m$imo sus conocimientos anteriores =eneralmente e$iste una e$a%eradsima tendencia a continuar usando el primer editor !ue se aprendi + lue%o se cambia solo de editor obli%ado por circunstancias poderosas Nosotros "emos decidido !ue en posteriores lecciones asumiremos !ue usted +a sabe usar -'i- Pronto tendr !ue "acer sus primeros pro%ramas en s"ellGscript Entonces necesitar un editor + nada me&or !ue -'iEn este curso se le da muc"a importancia a la cultura *ni$ Para una persona !ue aprende -'i- sur%en 'arias oportunidades para aplicar lo !ue sabe en comandos distintos de -'i- ,a forma de traba&ar de -'i- "a tenido muc"o impacto en otros pro%ramas Puede encontrar &ue%os. "o&as de clculo utilidades. etc !ue usan cosas parecidas a -'i- Xa 'imos -sed- !ue usa comandos similares a al%unos comandos de -'i- + a"ora 'amos a 'er a continuacin al%unas nociones de otro editor (-ed-) !ue es otro buen e&emplo de lo !ue estamos comentando Ke K 0ers#s K0iK Dado !ue -'i- est pensado para su uso interacti'o desde un terminal no resulta mu+ apropiado de usar en combinacin con otros pro%ramas mediante redireccin de entrada salida En el captulo anterior de e$presiones re%ulares 'imos como -sed- se poda usar como filtro de entrada salida E$iste un editor llamado -ed- !ue es capa# de editar te$to en modo no interacti'o Para ello se suele recurrir a un script !ue proporcionar a -ed- las instrucciones adecuadas (omos de la opinin de !ue las lecciones !ue no de&an 'er rpidamente cual es su utilidad + !ue no se practican estn condenadas al ol'ido Por eso !ueremos e'itar !ue piense en t5rminos de "para que necesito yo conocer esto de ed" Por eso ms tarde comentaremos al%o de -diff- combinado con -ed- 2s comprender me&or la utilidad del editor -ed2"ora 'amos a %enerar un fic"ero -e&emplo t$t- con unas pocas lineas para "acer unas pocas prcticas
$ $ / / / / cd Mtmp cat %%,-. / eRemplo+txt .o olvide visitar n"estra web httpVMMwww+ciberdroide+com y esto es todo+ ,-.

Vamos a sacar una copia para comprobar lue%o los cambios


$ cp eRemplo+txt eRemplo+txt+ori&inal

2"ora %eneramos un fic"ero con las instrucciones para editar el fic"ero anterior Deseamos !ue primero localice la linea !ue contiene ->>> ciberdroide com- + a continuacin a6ada una linea (comando -a-) -(Tienda Virtual de ,inu$)- (alimos al modo comandos (comando - -) (al'amos (comando ->-) + salimos (comando -!-)

$ / / / / / / / $

cat %%,-. / eRemplo+ed Mwww+ciberdroide+comM a ?Iienda Virt"al de Tin"xA + w # ,-. ed eRemplo+txt % eRemplo+ed

33 httpVMMwww+ciberdroide+com DD

Veamos como "a !uedado


$ cat eRemplo+txt .o olvide visitar n"estra web httpVMMwww+ciberdroide+com ?Iienda Virt"al de Tin"xA y esto es todo+

Podemos 'er las diferencias con el ori%inal usando el comando -diff- El comando diff es un comando !ue sir'e para se6alar diferencias entre dos fic"eros pero con la opcin Ge estas diferencias se e$presan en una forma adecuada para ser interpretadas por -ed- Veamos como funciona
$ di'' 0e eRemplo+txt+ori&inal eRemplo+txt 8a ?Iienda Virt"al de Tin"xA +

Vamos a partir del fic"ero ori%inal + le 'amos a pasar por la entrada estndar nicamente las diferencias obtenidas con -diff Ge$ cp eRemplo+txt+ori&inal eRemplo8+txt $ di'' 0e eRemplo+txt+ori&inal eRemplo+txt / eRemplo+di'' $ cat eRemplo+di'' 8a ?Iienda Virt"al de Tin"xA +

Vemos !ue falta las instrucciones ->- + -!- para sal'ar + salir respecti'amente as !ue las a6adimos al fic"ero -e&emplo diff$ / / / $ cat %%,-. // eRemplo+di'' w # ,-. cat eRemplo+di''

8a ?Iienda Virt"al de Tin"xA + w #

Xa tenemos todas las instrucciones necesarias Vamos a aplicar los cambios con -ed-

$ ed eRemplo8+txt % eRemplo+di'' 33 y esto es todo+ DD $ cat eRemplo8+txt .o olvide visitar n"estra web httpVMMwww+ciberdroide+com ?Iienda Virt"al de Tin"xA y esto es todo+

En lu%ar de %uardar 'arias 'ersiones de un %ran fic"ero !ue sufre pe!ue6as diferencias de 'e# en cuando se podra %uardar una sola 'ersin + unos pe!ue6os fic"eros con esas diferencias ocurridas entre una 'ersin + la si%uiente De esta forma podran aplicarse secuencialmente para ir recuperando sucesi'amente las 'ersiones anteriores en caso de necesidad Cuando se desarrolla una aplicacin se 'an introduciendo sucesi'amente cambios en los pro%ramas + para poder recuperar 'ersiones anti%cas "abra !ue ir sal'ando + conser'ando cada nue'a 'ersin ,os pro%ramas !ue se utili#an para el mantenimiento de distintas 'ersiones de una aplicacin suelen basarse en esta idea para a"orrar espacio de almacenamiento K0imK 0ers#s K0iK En ,inu$ e$iste un editor -'i- mu+ me&orado !ue se llama -'im- Este editor es mu+ similar a -'i- pero con importantes me&oras ,a ms importante sin lu%ar a dudas es la capacidad de des"acer retrocediendo uno a uno en los ltimos cambios reali#ados Esto permite recuperar a!uello de los destro#os !ue di&imos antes Tambi5n permite resaltar la sinta$is de ciertos fic"eros como s"ellG script. "tml. len%ua&e C. + otros muc"os len%ua&es Este + otros detalles lo "acen mu+ adecuado para pro%ramar El mane&o del cursor en los distintos modos del editor resulta muc"o ms cmodo + un montn de cosas ms 7as adelante 'eremos !ue se pueden usar distintas opciones para !ue el editor funcione en la forma !ue nosotros !ueramos -'im- puede e&ecutarse en modo compatible -'i- (1set compatible) pero es me&or usar el modo no compatible !ue nos proporcionar las a%radables 'enta&as sobre el -'itradicional !ue antes comentamos (1set nocompatible) =eneralmente en ,inu$ se instala -'im- como sustituto de -'i- de forma !ue aun!ue usted teclee -'i- en realidad puede estar e&ecutando -'im- o -el'is- u otros similares (al%amos de dudas1
$ vi 0[ 7 less

(olo si le in'ita a usar la opcin -G"- "%alo


$ vi 0h 7 less

Compruebe en las primeras lineas si se trata de -'im- (i +a "a entrado por error en editor sal%a mediante IE(CK 1!IENTE;K Continuemos a'eri%uando cosas
$ $ $ $ $ $ $ $ $ whereis vi whereis vim whereis elvis man vi man vim man elvis man ex man view man ed

2"ora si 'amos a entrar + a salir en el editor


$ vi

Xa est dentro del editor Compruebe si sale informacin relati'a al tipo de editor + sal%a tecleando

-1!- Para si%nificar !ue estamos en el editor -'i- pondremos el fondo a#ul oscuro + las letras en amarillo son las !ue salen en pantalla + en blanco las !ue introducimos nosotros
e e e e e e e e e e e e e V# V-K 0 Vi -Kproved version E+3 by Sram Koolenaar et al+ type type type type Vim is 'reely distrib"table Vhelp "&anda%Enter/ i' yo" li>e Vim V#%Enter/ Vhelp%Enter/ or %,@/ Vhelp versionE%Enter/ to exit 'or on0line help 'or version in'o

C#a ro res#men para el #so e K0iK 2 continuacin se describen una serie de comandos de uso frecuente en -'i- (e destacan los !ue se consideran ms importantes con un ma+or numero de asteriscos En una primera lectura le recomendamos !ue empiece a utili#ar + a aprender a!uellos comandos marcados con -YYY- !ue son los ms importantes ,e aconse&amos !ue no pase de leccin "asta !ue no se aprenda como mnimo los comandos calificados con -YYY- 2l final del captulo como es costumbre pondremos un test pero solo "aremos pre%untas sobre comandos calificados con -YYY- !ue sern los !ue practicaremos de forma especial en este captulo /emos a%rupado toda esta informacin en un nico cuadro para !ue sea su c"uleta. para usar + aprender -'i- (olo se inclu+en los comandos !ue suponemos sern de la ma+or utilidad para un usuario no'ato + dado !ue "a+ 'arias formas de "acer una misma cosa "emos ele%ido por usted + "emos clasificado de forma totalmente sub&eti'a una serie de comandos para !ue inicialmente ten%a !ue aprender solo un reducido nmero de ellos Tambi5n se inclu+en otros comandos para !ue pueda ser usado como un cuadro de consulta bastante completo
444 44 4 00/ Comando de "so imprescindible+ 00/ Comando de "so m"y 'rec"ente+ 00/ Comando de "so no tan 'rec"ente+

YYY 'i YYY 'i Ific"eroK Y YY YY 'i Ific"ero3K Ific"ero4K Ific"eroLK 'i G; Ific"eroK 'i Gr Ific"eroK

LINEA "E CO-AN"OS Editar un nue'o fic"ero Editar un fic"ero ((i el fic"ero es de solo lectura lo editara en modo solo lectura Editar 'arios fic"eros sucesi'amente Editar en modo solo lectura Editar recuperando modificaciones no sal'adas

-O"O CO-AN"OS (e pasa desde el modo entrada (insercin o reempla#o) mediante IE(CK YY YY YY YY -o0imien!os el c#rsor " IENTE;K & k Carcter anterior ,inea si%uiente ,inea si%uiente ,inea anterior

YY YY Y Y Y Y Y Y Y Y Y

IE(P2C@)K l , / 7 ICT;,R<K ICT;,RNK R G 0 D

Carcter si%uiente Carcter si%uiente *ltima linea de la pantalla Primera linea de la pantalla ,inea central de la pantalla ;etroceso de p%ina 2'ance p%ina Primer carcter de la linea si%uiente Primer carcter de la linea anterior Despla#arse al final de linea Despla#arse al principio de linea Pasar a modo entrada insertando Pasar a modo entrada reempla#ando 2'an#ar el cursor + pasar a modo entrada insertando @nsertar una linea despu5s de la actual + pasar a insertar @nsertar una linea antes de la actual + pasar a insertar

-o o en!ra a e !e,!o YYY i YYY ; YY Y a ) Corre/ir YYY u YYY ICT;,R;K YY YY Y Y Y * B#scar 8 P n N YYY o

Des"acer ltima modificacin (En 'im se pueden ir des"aciendo los los ltimos cambios en otros editores 'i solo se des"ace el ltimo cambio) En -'im- sir'e para des"acer el ltimo comando -u;ecuperar linea completa <usca una cadena de caracteres. "acia delante <usca una cadena de caracteres. "acia atrs (i%uiente en la bs!ueda 2nterior en la bs!ueda <orrar una linea borrar InK lineas 7eter una linea en el buffer 7eter InK lineas en el buffer Copiar la linea del buffer despu5s de la lnea actual Copiar la linea del buffer antes de la lnea actual ;efrescar pantalla (etil cuando se descompone la pantalla) Visuali#a el nombre del fic"ero. numero de lineas totales + en !ue linea estamos *ne la lnea actual con la si%uiente

Copiar) -o0er) 4 borrar lineas YYY dd YYY InKdd YYY ++ YYY InK++ YYY p Y P Varios YYY ICT;,R,K YY ICT;,R=K

YYY d

YY YYY 1 YYY WW

;epetir ltimo comando Pasar al modo e$ (7odo comandos) Terminar sal'ando si "ubo cambios -O"O EA (e pasa desde el modo de comandos al modo e$ con -1(e puede for#ar a entrar directamente en este modo usando la opcin -Ge- o e&ecutando el comando -e$-

YY Y Y

1IUlineaK 1e Ific"eroK 1e U

@r a una linea Pasa a editar de forma simultanea otro fic"ero Vol'er al fic"ero anterior (al'ar (No puede sobreescribir si se entr con 'i G;) (al'ar for#ando (Cuando falla 1>) (alir sal'ando si es necesario (al'ar con otro nombre (No puede e$istir el fic"ero) (al'ar con otro nombre for#ando (Permite sobreescribir) ,ee un fic"ero + lo car%a en el lu%ar indicado por la posicin actual del cursor E&ecuta en una subs"ell el comando + %uarda el resultado del mismo en la posicin indicada por el cursor (alir si no "a+ modificacin (alir sin sal'ar cambios (alir sal'ando cambios E&ecutar una subs"ell (se retorna con e$it) Visuali#ar lineas !ue tienen Is3K (ustituir %lobalmente Is3K por Is4K gdem pero pidiendo confirmacin (i%uiente documento 7irar fic"eros a editar 2bre'iaturas Teclear 3 se sustitu+e por 4 Desabre'iar Crear macro (m "ace n) (Ver e&emplos con macros) Crear macro en modo insercin (m "ace n) Destruir macro m Destruir macro de insercin m Cambiar de directorio actual 2cti'ar 'isuali#acin de nmeros de lnea 2cti'ar 'isuali#acin de nmeros de lnea Ver todas las opciones con sus 'alores )pcin de -'im- para no obli%ar a ser compatible -'iPara 'isuali#ar siempre el modo en !ue nos encontramos E&ecutar un comando en una subs"ell (Ver e&emplos con f)

YYY 1> YYY 1>f YY 1$ YYY 1> Ific"eroK YYY 1>f Ific"ero YYY 1r Ific"eroK YY 1r fIcomando

YYY 1! YYY 1!f YY Y Y Y Y Y Y Y Y Y Y Y Y Y YY YY YY YY 1>! 1s" 1%8Is3K8p 1%8Is3K8s88Is4K8% 1%8Is3K8s88Is4K8%c 1n 1ar%s 1ab m n 1unab m 1map m n 1mapf m n 1unmap m 1unmapf m 1cd 1set nu 1set nonu 1set all 1set nocompatible

YYY 1set s"o>mode YYY 1fIcomandoK

*n nmero de lnea (Ulinea) puede 'enir como1 *n punto *n punto GN -#c+os e es!os coman os p#e en aplicarse en!ro e #n ran/o e l?neas especi5ica o: *n nmero *n 0 *n 0 ,nea actual N ,neas antes de la actual

*n punto RN N ,neas despu5s de la actual N 0 V ,nea N *ltima lnea Desde la ltima a la primera lnea (2bre'iatura de 3.0)

YYY 1Ulinea3. Ulinea4 > Ific"eroK (al'ar desde 3 "asta la 4 en Ific"eroK YY YY YY YY 1Ulinea3. Ulinea4 co UlineaL 1Ulinea3. Ulinea4 mo UlineaL 1Ulinea3. Ulinea4 de Copiar desde 3 "asta 4 en L 7o'er desde 3 "asta 4 en L <orrar desde 3 "asta 4

(ustituir la primera ocurrencia en cada linea desde 3 "asta la 1Ulinea3. Ulinea4 s8Is3K8Is4K 4 la cadena Is3K por la cadena Is4K 1Ulinea3. Ulinea4 s8Is3K8Is4K8c 1Ulinea3. Ulinea4 s8Is3K8Is4K8% 1Ulinea3. Ulinea4 s8Is3K8Is4K8%c (ustituir la primera ocurrencia en cada linea desde 3 "asta la 4 la cadena Is3K por la cadena Is4K con confirmacin (ustituir todas las ocurrencias en cada linea desde 3 "asta la 4 la cadena Is3K por la cadena Is4K

YY

YY

(ustituir todas las ocurrencias en cada linea desde 3 "asta la 4 la cadena Is3K por la cadena Is4K con confirmacin (era con'eniente !ue sacara por la impresora esta informacin para usarla a modo de c"uleta en sus primeras prcticas con -'iYY E$iste otra forma de aplicar comandos dentro de un ran%o de lineas Desde el modo de comandos pulsando -'- se pasa al modo -'i- o modo -'isual- Entonces mo'iendo el cursor marcamos todo el ran%o de lineas !ue !ueramos tratar + pulsando -1- pasamos al modo -e$- para aplicar el comando !ue !ueramos Cual!uier comando !ue se pueda introducir en -'i- estando en el modo de -e$- puede ser incluido en un fic"ero e$rc en el 0/)7E !ue ser'ir para !ue -'i- e&ecute esos comandos cada 'e# !ue arran!ue (e usa muc"o para definir macros + para acti'ar determinadas opciones con set pero eso lo 'eremos en otro captulo Prac!ican o lo ms esencial e K0iK: (i no se usa nin%una opcin inicial 'i empe#ar en modo comandos Para pasar al modo entrada "a+ 'arias formas pero recomendamos !ue se aprenda de momento solo i. a. o. ; Xa "emos descrito estas funciones en -c"uletaG'i t$t- + practicaremos con ellas ms adelante Del modo entrada (@nsertar o reempla#ar) se sale con IE(CK Normalmente traba&bamos en -8tmp- como directorio temporal pero esta 'e# 'amos a crear un directorio nuestro de traba&o para poder conser'ar nuestro traba&o el tiempo !ue !ueramos Para ello crearemos un directorio -cursolinu$- + nos situaremos en 5l para traba&ar

$ $ $ $

cd m>dir c"rsolin"x cd c"rsolin"x vi eR0vi@+txt

Dado !ue no e$ista nin%n fic"ero -e&G'i3 t$t- estaremos editando un fic"ero nue'o + dependiendo del editor usado (nosotros usaremos -'im-) aparecer al%o del tipo
e e e OeR0vi@+txtO 5.ew ,ile6

Est en modo comandos + 'a a teclear sus dos primeros comandos Cuando 'ea -IENTE;K- en los e&emplos si%nifica !ue debe pulsar esa tecla
Vset showmode%E.IER/ Vset n"%E.IER/

2cabamos de acti'ar la 'isuali#acin del modo de funcionamiento + la 'isuali#acin de los nmeros de lnea Nin%una de estas cosas son necesarias para editar un fic"ero pero a nosotros nos 'an a a+udar a 'er ms claro lo !ue "acemos 2"ora pulsaremos la -i- + aparecer en la linea inferior el indicador de !ue estamos en modo entrada para insercin Desde este modo introduciremos las si%uientes lineas de te$to
@ 8 3 C E ; 3 UU Estamos practicando con el editor vi+%E.IER/ .o parece tan di'Ncil de "sar+%E.IER/ Ja voy por la tercera linea y no ha oc"rrido nada &rave+%E.IER/ %E.IER/ %E.IER/ Como he saltado "n par de lNneas voy por la linea seis+%E.IER/ He momento no escribo nada mFs+%E<C/

Con la tecla IE(CK salimos al modo comandos + con -WW- (ma+sculas) desde el modo comandos salimos sal'ando el fic"ero 2"ora 'amos a 'ol'er a editarlo
$ vi eR0vi@+txt

Vol'emos a acti'ar los modos -s"o>mode- + -nu- + nos situamos en la lnea L + la borramos con -ddlue%o nos situamos en la primera lnea + "acemos -p- !ue copiar la linea eliminada a continuacin de la lnea primera -dd- %uarda siempre en un buffer la informacin eliminada para poder recuperarla con -p- Podramos "aber borrado cinco lineas de %olpe usando -Bdd- + las cinco lneas "abran sido %uardadas en el buffer para su posible recuperacin con -pVset showmode%E.IER/ Vset n"%E.IER/ V3%E.IER/ dd V@%E.IER/ p

Pero a"ora la lnea 4 dice !ue es la tercera as !ue intente usted mismo borrar una de las lneas 'acas + situarla como se%unda lnea usando de nue'o -dd- + -p- Esta 'e# mue'a de linea usando -&desde el modo comandos para ba&ar a la linea si%uiente + -k- para subir a la lnea anterior (i el teclado est confi%urado en su editor para mane&ar correctamente las teclas de flec"as podr "acer esto mismo usando las teclas flec"a aba&o + flec"a arriba en sustitucin de la -&- + la -krespecti'amente (i al%o sale mal borre el fic"ero + 'uel'a a empe#ar procurando no 'ol'er a meter la pata <ueno el caso es !ue el fic"ero debera !uedar con este aspecto

@ 8 3 C E ; 3

Estamos practicando con el editor vi+ Ja voy por la tercera linea y no ha oc"rrido nada &rave+ .o parece tan di'Ncil de "sar+ Como he saltado "n par de lNneas voy por la linea seis+ He momento no escribo nada mFs+

Vamos a sacar una copia de este fic"ero modificado con otro nombre. + lue%o 'amos a duplicar 'arias 'eces el contenido de las lneas cuatro + cinco usando -4++- (%uarda en el buffer dos lineas) + -p- para (copia el contenido del buffer en la lnea actual) 2se%urese !ue est en modo comandos Pulse IE(CK si no est se%uro + teclee los comandos si%uientes 2d'ierta !ue al%unos comandos empie#an por -1- + terminan por IENTE;K mientras !ue otros no
Vw eR0vi8+txt VC%E.IER/ 8yy V3%E.IER/ p V3%E.IER/ p V3%E.IER/ p

Estamos repitiendo 'arias 'eces la lnea -No parece tan difcil de usar - Debera !uedar finalmente con este aspecto
@ 8 3 C E ; 3 : D @B @@ @8 @3 Estamos practicando con el editor vi+ Ja voy por la tercera linea y no ha oc"rrido nada &rave+ .o parece tan di'Ncil de "sar+ .o parece tan di'Ncil de "sar+ .o parece tan di'Ncil de "sar+ .o parece tan di'Ncil de "sar+ Como he saltado "n par de lNneas voy por la linea seis+ He momento no escribo nada mFs+

Como "emos 'isto con -4++- "emos metido en el buffer dos lineas en lu%ar de una Para meter una sola linea "abra bastado usar -++- o -3++- 2"ora 'amos a salir pero sin %uardar nin%uno de los cambios reali#ados Primero intentaramos salir sin ms con -1!- desde el modo comandos
V#

)btendremos un a'iso del editor para no perder las ltimas modificaciones


.o write since last chan&e ?"se b to overrideA

Pero realmente deseamos salir sin sal'ar as !ue intentamos de nue'o con -1!f- desde el modo comandos
V#b

Vamos a comprobar !ue los ltimos cambios no se "an %uardado. + 'amos a 'er !ue permisos tiene este fic"ero

$ cat eR0vi@+txt Estamos practicando con el editor vi+ .o parece tan di'Ncil de "sar+ Ja voy por la tercera linea y no ha oc"rrido nada &rave+ Como he saltado "n par de lNneas voy por la linea seis+ He momento no escribo nada mFs+ $ ls 0l eR0vi@+txt 0rw0r00r00 @ xxxx xxxx 8@; a&o @8 @:V8C eR0vi@+txt

,a informacin de permisos puede ser diferente ;ecuerde !ue di&imos !ue los permisos de un fic"ero cuando se crea dependen de la -umask- pero a"ora solo nos interesa comprobar efecti'amente tenemos permisos para leer + escribir en este fic"ero Vamos a eliminar los permisos de escritura del fic"ero + 'amos a intentar editarlo nue'amente
$ chmod CCC eR0vi@+txt $ ls 0l eR0vi@+txt 0r00r00r00 @ xxxx xxxx $ vi eR0vi@+txt

8@; a&o @8 @:V8C eR0vi@+txt

Probablemente aparecer en la linea inferior de su editor una ad'ertencia de !ue est en modo solo lectura
OeR0vi@+txtO 5readonly6 3 lines* 8@; characters

<ueno a pesar de ello 'amos a intentar "acer cambios + como estamos practicando continuaremos con una serie de comandos !ue an no "emos 'isto + !ue tenamos clasificados con -YYYV3 V+*$ w tro(o'inal V@*+ w tro(oinicial V@*$ de Vr tro(oinicial V$ Vr bdate V$ Vr tro(o'inal Vw temp'ich Vw $readonly$ option is set ?"se b to overrideA

Permiti escribir otros fic"eros pero se nie%a a sobrescribir el fic"ero !ue estamos editando con los cambios por!ue est en modo solo lectura + su%iere !ue usemos -f- para for#ar su escritura
Vwb

En este caso estamos for#ando la situacin + estamos escribiendo en un fic"ero en el !ue no tenemos permisos pero puesto !ue somos propietarios del mismo el editor puede mane&ar los permisos para dar permiso de escritura. sobrescribir el fic"ero + 'ol'er a cambiar los permisos de&ando los permisos ori%inales Podemos e&ecutar comandos desde el editor as !ue por!ue no miramos los permisos con -ls Gl-

Vbls 0l total ; 0r00r00r00 0r00r00r00 0rw0r00r00 0rw0r00r00 0rw0r00r00 0rw0r00r00 @ @ @ @ @ @ xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx 3BC 3BC 8@; 3BC @C3 @8; a&o a&o a&o a&o a&o a&o @8 @8 @8 @8 @8 @8 @DV@@ @DV@@ @:V8: @DVBD @DVB; @DVB; eR0vi@+txt eR0vi@+txte eR0vi8+txt temp'ich tro(o'inal tro(oinicial

!ress REILR. or enter command to contin"e

Debemos pulsar IENTE;K para 'ol'er al editor Puesto !ue podemos e&ecutar cual!uier comando tambi5n podemos e&ecutar bas" como una subs"ell 2pro'ec"aremos para 'er los procesos acti'os
Vbbash bash08+B@$ ps !-H IIJ <IAI I-KE 88@ 8 < BVBB :D3 8 < BVBB DCC 8 < BVBB DE@ 8 R BVBB bash08+B@$ exit exit @ ret"rned !ress REILR. or enter command to contin"e COKKA.H 0bash vi eR0vi@+txt bash ps

Por fin estamos de 'uelta en el editor Vamos a continuar practicando al%unos comandos importantes !ue nos !uedan
V3%E.IER/ o Hemos pasado a insertar abriendo "na linea+%E<C/ ]

Con la -d- ma+scula "emos unido dos lneas en una 2"ora 'amos a pasar al modo entrada para reempla#ar

E.IER/

99999999999999%E<C/sertar abriendo "na linea+ %E<C/ %CIRT2X/

Ja voy por la tercera linea y no ha oc"rrido nada &ra

OeR0vi@+txtO 5Kodi'ied65readonly6 line C o' @B 00CB^00 col CC

Desde el modo comandos podemos consultar el nombre del fic"ero. cuantas lineas tiene en total. en !ue lnea + columna estamos. + otras cosas con solo pulsar ICT;,R=K 2"ora utilice 'arias 'eces el comando -u- (i est en -'im- 'er como se des"acen retrocediendo secuencialmente en las ltimas modificaciones !ue "emos reali#ado ,ue%o si est usando -'im- use ICT;,R;K para a'an#ar de nue'o en las ltimas modificaciones "asta recuperarlas todas Para terminar sal%a con -1!fPracti!ue con la combinacin de -++- o -n++- + -p- ) con la combinacin -dd- o -ndd- + -p- (e usan muc"o para copiar o trasladar pe!ue6os blo!ues de informacin Para mo'er una linea "acer -dd-. lue%o situarse en la posicion destino + "acer -p- Para mo'er 'arias

lineas "acemos al%o parecido <orramos primero 'arias lineas + lue%o desde la posicin destino "acemos -p- Para copiar en lu%ar de mo'er usaramos -++- en lu%ar de -dd<ueno utilice su propia ima%inacin e in'esti%ue + practi!ue por su cuenta Esta leccin no le obli%a a di%erir conceptos nue'os pero si re!uiere iniciati'a para practicar con el editor E$iste un comando !ue lo "emos marcado como esencial cuando en realidad se usa po!usimo pero es un comando !ue con'iene conocer por!ue en el momento ms inesperado puede ser necesario usarlo Con este comando el editor redibu&a totalmente el contenido de la pantalla Esto puede ser necesario por!ue a su terminal podra lle%arle informacin desde otro proceso Por e&emplo un mensa&e de error del sistema o un a'iso de su administrador para !ue finalice antes de 3D minutos 9ui#s su administrador es de los !ue repite el mensa&e ms de una 'e# + a cada mensa&e recibido su pantalla !ueda totalmente destro#ada No pasa nada Pulse ICT;,R,K + todo 'ol'er a la normalidad Esto puede ocurrirle cuando este usando otro pro%rama distinto de -'i- + !ui#s pueda usar %ualmente ICT;,R,K 1ec#perar la in5ormacin per i a por m#er!e prema!#ra el e i!or )tra cosa !ue debe saber es !ue cuando -'i- recibe una se6al para finali#ar ordenadamente %uardar el contenido de lo !ue est editando en un fic"ero de se%uridad Para recuperar esta informacin necesitar usar -'i Gr fic"ero- Como e&ercicio libre le proponemos !ue empiece a editar un fic"ero !ue llamaremos -pruebaGkill t$t- Escriba unas cuantas cosas + sin sal'ar nada. pase a otro terminal + en'e un kill con el 'alor por defecto (3B Q (@=TE;7) Para eso primero tendr !ue a'eri%uar el pid del proceso 'i Por e&emplo use -ps H %rep 'i- (upon%amos !ue a'eri%ua !ue su pid es AAB <astara "acer -kill AAB- Esto finali#ar la edicion del fic"ero -pruebaGkill t$t- No edite este fic"ero con -'i pruebaGkill t$t- por!ue perder todos los cambios En cambio si edita con -'i Gr pruebaG kill t$t- si los recuperar En este punto sal'e + continue editando cosas + antes de sal'ar los nue'os cambios 'uel'a a a'eri%uar el pid desde otro terminal (upon%amos !ue el nue'o pid fuera AAE En'e esta 'e# la se6al (@=O@,, no enmascarable mediante -kill GF AAE- Comprobar !ue esta 'e# el editor no ser capa# de recuperar los cambios Por e&emplo si ocurre un apa%ado normal (s"utdo>n) del sistema mientras est usted editando o mientras usted est ausente del terminal con la sesin de edicin abierta. tampoco ocurrir nada ,a ra#n de esto. es !ue el sistema primero en'a a todos los procesos acti'os una se6al de (@=TE;7 para !ue finalicen ordenadamente Despu5s de esto + pasados unos se%undos se supone !ue la ma+ora de los procesos "abrn terminado (2 los restantes procesos les en'iar un (@=O@,, para matarlos incondicionalmente ) Cuando le ocurra esto tendr !ue 'ol'er a entrar en sesin con lo%in + se%uramente recibir una notificacin en su correo ad'irtiendo de la e$istencia de un fic"ero !ue debe ser editado con la opcin -Gr- para recuperar informacin 'olcada durante la finali#acin prematura de -'i-

EL E"ITO1 VI %se/#n a par!e'


)b&eti'os de esta leccin <s!uedas (ustituciones Edicin de 'arios fic"eros secuencialmente Edicin simultanea de fic"eros Visuali#acin de caracteres de control @ntroduciendo caracteres de control en el te$to El comando tilde )peraciones con blo!ues ;epeticin del ltimo comando Tabulacin 2bre'iaturas

7acros )pciones de 'i Confi%uracin del editor Ta% Test

Ob2e!i0os e es!a leccin Esta leccin menciona al%unas posibilidades a'an#adas del editor -'i- (e supone !ue el alumno "a estudiado las lecciones precedentes + en particular el captulo anterior dedicado al editor -'i- Eso si%nifica !ue +a sabe editar Vamos a suponer !ue incluso "a practicado un poco por su cuenta Por ello lo !ue 'amos a e$plicar en este captulo ser de escasa utilidad si no "a asimilado la leccin anterior Poco a poco 'amos a ir asumiendo un ma+or dominio del alumno Xa no 'amos a detallar tan a menudo paso por paso cosas !ue +a se "an e$plicado + practicado ms de una 'e# Eso le obli%ar a poner un poco ms de iniciati'a por su parte ,os e&emplos de las lecciones anteriores eran prcticas totalmente %uiadas. comando a comando. pero a partir de a"ora tendr !ue probar cosas no necesariamente id5nticas a los e&emplos !ue nosotros utilicemos No se preocupe (e%uro !ue lo "ar mu+ bien (i "a lle%ado "asta a!u es se6al de "aber conse%uido un a'ance si%nificati'o en sus conocimientos. + como ,inu$ero se encuentra !ui#s a medio camino entre el no'ato bruto + e$tremadamente torpe + el repu%nante listillo informtico 1G) Confiamos plenamente en su capacidad pero recuerde !ue nosotros no somos responsables de lo !ue pueda pasarle a su ordenador Contine practicando con un usuario distinto de root + un directorio !ue no conten%a informacin 'aliosa (e%uramente en esta leccin aprenda cosas !ue al%unas personas !ue lle'an usando -'i- durante 'arios a6os an no conocen. pero tambi5n contiene cosas !ue pueden ser mu+ importantes para usted No todos usamos las mismas cosas ,a ma+ora de los documentos !ue e$plican el uso de -'ilo "acen de forma mu+ incompleta Nosotros no 'amos a "acer un tratado completo de este editor por!ue necesitaramos muc"as lecciones + nos saldramos de los ob&eti'os del curso pero si procuraremos mostrarle un amplio abanico de posibilidades para !ue ten%a donde ele%ir En la primera leccin sobre -'i- le mostramos un &ue%o reducido de comandos pero suficiente para defenderse En esta leccin le damos la posibilidad de con'ertirse en un 'irtuoso de este editor B$s8#e as Desde el modo comandos se puede usar -8- para buscar 2dmite e$presiones re%ulares Por e&emplo si introduce -8debian com- podra locali#ar una cadena -debianGcom- o -debian1com- + no solo -debian com- ;ecuerde !ue al%unos caracteres como el punto el asterisco. etc tienen un si%nificado especial + para usarlas en -'i- "a+ !ue precederlas de -:- !ue actuar como carcter de escape Tambi5n "a+ !ue escapar los caracteres como por e&emplo -8- + -T- por!ue sin tener si%nificado como operador de e$presin re%ular si tiene un si%nificado especial para -'i- !ue 'eremos cuando e$pli!uemos las sustituciones No 'amos a 'ol'er a e$plicar las e$presiones re%ulares por!ue +a dedicamos una leccin Practi!ue lo !ue 'a aprendiendo + recuerde !ue las e$presiones re%ulares no funcionan i%ual en todas las aplicaciones Vamos a poner 'arios e&emplos para su uso en bs!uedas desde -'i- Para buscar -I8T2<,EK- "abra !ue usar -8I:8T2<,EKEs decir !ue al%unos caracteres no los podemos usar tal cual para buscarlos sino !ue "a+ !ue es caparlos En el caso anterior "emos escapado -8- Ten%a en cuenta esto cuando intente por e&emplo buscar un carcter -0- en un te$to Con -n- buscar la ocurrencia si%uiente de la cadena en el fic"ero Con -N- buscar la ocurrencia anterior *na 'e# lle%ado al final comien#a de nue'o la bs!ueda por el principio Tambi5n se puede empe#ar la bs!ueda desde el primer momento en sentido ascendente usando -P-

en lu%ar de -8- En este caso los comandos -n- + -N- tambi5n funcionaran en sentido contrario !ue con el comando -8(i usamos -8- o -P- sin nada ms a continuacin. se repetir la ltima bs!ueda ,as e$presiones re%ulares ofrecen %randes posibilidades como +a "emos 'isto pero particularmente interesantes para -'i- pueden ser las bs!uedas a principio o a final de una lnea En el e&emplo buscaremo -El- a principio de una lnea + lue%o -as- al fineal de lnea
$MYEl$ $Mas$$

S#s!i!#ciones Xa dispone de un resumen de todos los comandos de -'i- !ue proporcionamos en el captulo anterior as !ue lo me&or es presentar una serie de e&emplos e$plicando para !ue sir'en Vamos a poner tres formas distintas de sustituir -encarnado- por -colorado- en las tres primeras lneas de un te$to. + solo deseamos !ue ocurra la sustitucin en la primera ocurrencia de cada lnea caso Es decir si una lnea contiene 'arias 'eces la palabra -encarnado- solo deseamos sustituir la primera
V@*3 sMencarnadoMcoloradoM V@*3 sVencarnadoVcoloradoV V@*3 sfencarnadofcoloradof

2"ora de dos formas distintas 'amos a sustituir en todo el te$to -encarnado- por -colorado- Es decir si una linea contiene 'arias 'eces la palabra -encarnado- deseamos !ue la sutitucin se realice en todas ellas Para eso utili#aremos un comando similar al anterior pero finali#ado en -8%- ,os e&ememplos solo 'aran en la forma de indicar con -3.0- o con -V- la bs!ueda en todo el te$to
V@*$ sMencarnadoMcoloradoM& V^ sMencarnadoMcoloradoM&

2"ora si sutituimos en todo el te$to -encarnado- por -colorado- pero confirmando cada cambio manualmente Para eso utili#aremos un comando similar al anterior pero finali#ado en -8%c- ,a -%tiene el mismo si%nificado !ue en el caso anterior + la -c- si%nifica -confirmacinV@*$ sMencarnadoMcoloradoM&c

Vamos a usar a"ora las sustituciones con e$presiones re%ulares 3) Poner a doble lnea todo un te$to
V^sM$MQ M&

4) Eliminar blancos + tabuladores a final de linea


V^sM5space tab64$MM

L) Eliminar blancos + tabuladores al principio de lnea


V^sMY5space tab64MM

A) (ustituir cual!uier secuencia de blancos + tabuladores por un nico blanco


V^sM5space tab65space tab64M M

B) Poner entre par5ntesis todos los nmeros enteros de un te$to


V^sM5B0D65B0D64MQ?`QAM&

En este ltimo "emos usado el operador -T- en la misma forma !ue 'imos con -sed- unas lecciones atrs (e pueden "acer en poco tiempo cosas bastante comple&as Por e&emplo 'amos a "acer un

s"ellGscript !ue %enere otro s"ellGscript Para ello primero lo !ue "aremos es escribir el pro%rama !ue deseamos %enerar
echo $>>>>$ echo $>>>>$Q$$hhhh$

Para %enerarlo bastar tratar cada lnea poniendo un ?ec"o -? al comien#o de cada lnea + una comilla simple al final ?-? de cada lnea. pero antes escaparemos cual!uier posible comilla simple !ue pudiera e$istir Para ello editamos el te$to anterior + "acemos lo si%uiente1
V^ sMQ$MQ$QQQ$Q$M& V^ sMYMecho Q$M V^ sM$MQ$M

Deber !uedarnos de esta forma


echo $echo $Q$$>>>>$Q$$$ echo $echo $Q$$>>>>$Q$$Q$Q$$$Q$$hhhh$Q$$$

<ueno lo "emos reali#ado con -'i- + a pesar de lo complicado del resultado solo "emos reali#ado tres operaciones sencillas 2"ora e&ecute este fic"ero + 'er como obtiene el primero <ueno si no conoce C no le entusiasmar este otro e&emplo pero eso de "acer pro%ramas !ue %eneran pro%ramas nos sir'e para practicar las sustituciones usando -'i- Podemos escribir el pro%rama en C !ue deseamos %enerar + lue%o tratarlo sustitu+endo todas las -:- por -::- + todas las -?por -:?- Es decir escapamos esos dos caracteres !ue daran problemas ms tarde ,ue%o a6adimos a principio de cada lnea -printf(?- + finali#amos cada lnea con -:n?)S,as sustituciones !ue acabamos de mencionar seran de esta forma
V^ V^ V^ V^ sMQQMQQQQM& sMOMQQOM& sMYMprint'?OM sM$MQQnOAPM

E icin e 0arios 5ic+eros sec#encialmen!e 2l editor -'i- se le puede pasar como ar%umento no solo un fic"ero sino 'arios para ser editados en secuencia Por e&emplo1
$ vi 'ich@ 'ich8 'ich8

<ueno esto puede ser ms til de lo !ue parece a simple 'ista Vamos a suponer !ue tenemos !ue modificar una %ran cantidad de fic"eros para sustituir en muc"os de ellos la cadena -acastro- por la cadena -2 Castro- pero tampoco lo podemos "acer de forma automtica por!ue nos con'iene 'er caso a caso Por eso pasamos a -'i- el resultado de una bs!ueda con -%rep$ vi =&rep 0il acastro 4+txt=

*na 'e# dentro del editor "acemos lo si%uiente


Var&s

El comando -1ar%s- nos informar del nombre de los fic"eros !ue 'amos a editar secuencialmente @ntente probar esto creando sus propios fic"eros de prueba Xa sabe como "acerlo Con'iene !ue todos ellos ten%an una cadena id5ntica para ser locali#ada con %rep *na 'e# !ue el editor -'i- este preparado para editar secuencialmente 'arios fic"eros bus!ue la cadena con el operador -8- + aun!ue pasemos a editar el si%uiente fic"ero se conser'ar almacenada la cadena de bs!ueda Esta forma de traba&ar facilita muc"o la modificacin de 'arios fic"eros Para editar fic"eros secuencialmente le con'iene tener en cuenta los si%uientes comandos 2l%unos no los "abamos comentado toda'a

Var&s Obtiene la lista de los 'icheros Vnext !asa al 'ichero si&"iente Vprev V"elve al 'ichero anterior Vrewind V"elve al primero Vrewindb V"elve al primero abandonando los cambios en el 'ichero act"al Vw <alva los cambios del 'ichero anterior V# <ale del editor+ ?<olo si ya se han editados todosA V#b <ale del editor incondicionalmente+

E icin sim#l!anea e 5ic+eros Podemos pasar de la edicin de un fic"ero a la edicin de otro usando -1e fic"ero- pero antes deberemos sal'ar el contenido de la edicin actual Tambi5n podemos for#ar el paso a editar otro fic"ero con -1ef fic"ero- pero en ese caso se perdern las modificaciones reali#adas *sando -1eU'ol'emos a retomar la edicin del fic"ero anterior situados en la misma lnea donde lo de&amos @ntente practicar lo si%uiente editando unos fic"eritos de prueba
Ve 'ich@ Vw Ve 'ich8 Veb 'ich3 Ve

Vis#ali>acin e carac!eres e con!rol En -'i- los caracteres de control se 'isuali#an como un acento circunfle&o + una letra Por e&emplo ICT;,ROK se 'isuali#ar como -bO- + la manera de distin%uir un carcter circunfle&o real se%uido de una -O- es mo'iendo el cursor para 'er si de despla#a uno o dos caracteres cuando pasamos por el carcter circunfle&o Tambi5n se usa con similar si%nificado el carcter tilde -\- pero para caracteres de E bits In!ro #cien o carac!eres e con!rol en el !e,!o @ma%inemos !ue deseamos introducir un carcter de control para pro'ocar un salto de p%ina en la impresora Para ello deberemos introducir un ICT;,R,K !ue ser 'isuali#ado como -b,- ,a forma de "acerlo es pulsar desde el modo insercin el carcter ICT;,RVK + a continuacin el carcter ICT;,R,K Es decir el carcter ICT;,RVK acta como carcter de escape Podemos pulsar ICT;,RVK + lue%o una tecla de funcin. u otras teclas especiales Tambi5n se pueden buscar caracteres de control Para ello tamben "a+ !ue introducirlos usando ICT;,RVK Edite un fic"ero de prueba + proceda a poner 'arios saltos de p%ina en distintos lu%ares ,ue%o bus!ue con -8- + con -P- los saltos de p%ina Pruebe a insertar los cdi%os de las teclas IENTE;K + IE(CK. mediante ICT;,RVKIENTE;K + ICT;,RVKIE(CK respecti'amente Debern aparecer como -b7- + como -b_El coman o !il e El comando -\- sustitu+e el carcter situado ba&o el cursor de ma+scula a minscula + 'ice'ersa a'an#ando lue%o el cursor Operaciones con blo8#es (e pueden marcar "asta 4C posiciones (-a- -#-) para un con&unto de uno o mas fic"eros editados simultneamente Permite traba&ar marcando principio + fin de blo!ues para mo'er. copiar o borrar en 'arios fic"eros (e pueden usar las marcas en cual!uier comando en sustitucin de - -. -0-. o los nmeros de lnea como +a "emos 'isto ,a 'enta&a es !ue si estamos insertando o borrando lneas tendramos !ue 'ol'er a comprobar los nmeros de lneas Por el contrario si "emos colocado una marca en una lnea continuar en esa lnea mientras no la eliminemos Para colocar una marca podemos situarnos con el cursor en la lnea deseada + lue%o "acer -1k IletraGminsculaK- -1ma IletraG minsculaK- -1ma IletraGminsculaK- o directamente sin pasar al modo e$ mediante -m IletraG minsculaK- Para practicar con ello edite un fic"ero de prueba + colo!ue 'arias marcas en distintas lneas ,ue%o realice distintas operaciones como por e&emplo el borrado de blo!ues Compruebe

como desaparece una marca cuando se borra la lnea !ue la contiene ,as marcas no se 'en pero si intenta usar una marca !ue no e$iste obtendr un error Compruebe como reaparece la marca cuando des"ace la operacin con -u- (undo) 2l%unas formas de utili#acin de marcas son las si%uientes
V$a*$b de V$b*$b2@ de V$a*+ de V$a*$b co $c V$a*$b mo $c

Tambi5n podemos posicionarnos en el lu%ar de una marca pulsando comillaGsimple + IletraG minsculaK desde el modo comandos *n detalle interesante es !ue siempre podemos 'ol'er a la lnea donde nos encontrbamos. la ltima 'e# !ue dimos un salto de posicin en el te$to Para ello pulsamos -- (comillaGsimple dos 'eces) 1epe!icin el $l!imo coman o Cuando "a+ !ue "acer 'arias 'eces la misma cosa resulta tremendamente til poder repetir el ltimo comando @ma%inemos !ue desde el modo de comandos "acemos en una lnea -;,nea IE(CK- para sustituir C caracteres por la cadena -,nea - @nmediatamente despu5s de ello + antes de "acer nin%una otra cosa podramos situarnos en otra lnea + pulsar - - (punto) para repetir ese mismo comando + lue%o cambiar a otra + otra lnea + 'ol'er a pulsar - - punto a cada 'e# para efectuar el mismo cambio en 'arios sitios Tamben mencionamos la posibilidad de e&ecutar un comando del sistema operati'o lan#ando una subGs"ell Pues bien este tipo de comandos -1 IcomandoK- puede ser repetido usando -1ffTab#lacin El carcter con la tecla IT2<K o con el carcter ICT;,R@K insertar un carcter de tabulacin El anc"o de la tabulacin ser por defecto i%ual a E espacios Esto puede ser 'ariado por e&emplo a B con -1set tabstopQB- (i deseamos a6adir un tabulador al principio de lnea en las si%uientes a lineas a la posicin del cursor podemos "acer -aKK- Tamben se podra "aber "ec"o lo mismo con -1 . Ra KK- Para insertar un tabulador a principio de cada lnea del te$to sera -1V KK- Cuando se usa el editor para editar fuentes de pro%ramas puede resultar til usar la indentacin automtica -set aipara eliminar la indentacin automtica usaremos -set noai- (i en al%una ocasin necesita sustituir todos los tabuladores por caracteres en blanco use el comando -e$pand- No es un comando de -'isino del () Consulte con el man su sinta$is + las distintas opciones Para "acer una prueba edite un fic"ero insertando tabuladores + lue%o con'iertalo de la si%uiente forma
expand 'ichero / 'icheroexpandido+

Abre0ia!#ras En -'i- "a+ muc"os detalles pensdos a a"orrar pulsaciones de declas Vamos a 'er el comando -1ab(i est acostumbrado al uso de abre'iaturas le resultar mu+ prctico Puede definir las abre'iaturas !ue !uiera + una 'e# tecleadas en modo entrada de dados (insercion o sobrescritura) sern sustituidas por la cadena !ue desee Vamos a usar dos abre'iaturas una -ci- para -Ciberdroide @nformtica- + otra -@N7/)- para -en mi "umilde opinin- Tambi5n 'amos a listar las abre'iaturas definidas
Vab ci Ciberdroide -n'ormFtica Vab -.KHO en mi h"milde opini)n Vab

*se sus propias abre'iaturas en un te$to + obser'e como la abre'iatura no ser interpretada si la secuencia de caracteres forma parte de una palabra -acros Es posible pro%ramar macros Por e&emplo 'amos a "acer una macro !ue mue'a A lneas al final del fic"ero

Vmap xxx CddV$YKp Vmap

Con esta macro ocurrir al%o En primer lu%ar si teclea las tres -$- se%uidas se e&ecutarn los comando -Add- (borrar cuatro lineas). -10IENTE;K- (ir a la ltima lnea) + -p- (recuperar el contenido del buffer) (i pulsamos una sola -$- notaremos !ue no pasa nada inmediatamente pero lue%o se eliminar un carcter tal + como ocurre normalmente Es decir la macro tiene un tiempo para ser tecleada completamente en caso contrario no acta Para 'er todas las macros definidas usaremos -1mapPodemos eliminar la macro !ue acabamos de crear con -unmapV"nmap xxx

7uc"as 'eces se usan las macros para definir comandos asociados a teclas especiales Para ello "a+ !ue conocer la secuencia de caracteres !ue en'an esas teclas (i en modo insercin usamos ICT;,RVKIN4K obtendremos -b___<- Pero tambi5n podemos usar -IN4K- para definir macros Vamos a poner al%unos e&emplos prcticos N4 (Niltro P=P) Nirmar
Vmap 55S @XbXp&p 0sat' 8/MdevMtty

(era lo mismo si usaramos -IN4K- en lu%ar de -b___<Vmap %,8/ @XbXp&p 0sat' 8/MdevMtty

NL (Niltro P=P) Encriptar


Vmap 55C @XbXp&p 0eat' 8/MdevMtty

NA (Niltro P=P) Desencriptar + comprobar firma


Vmap 55H @XbXp&p 8/MdevMttyP sleep 3

NB (Niltro ispell) Corrector orto%rfico


Vmap 55E Vw Vbispell ^ Veb

Opciones e 0i (era absurdo pretender e$plicar en una leccin todo el editor -'i- Tampoco "a+ necesidad de ello /a+ montones de opciones + +a "emos 'isto al%unas (i el editor es -'im- en lu%ar de -'i- el nmero de posibilidades es aun ma+or Puede 'er las opciones disponibles + sus 'alores actuales usando el comando -1set all- desde el modo de comandos No se asuste No "a !ue conocerlas todas /a+ opciones !ue se%uramente la persona !ue las implement +a "a ol'idado para !ue sir'en *na opcin se puede indicar muc"as 'eces de dos formas *na en forma completa + otra en forma abre'iada Por e&emplo -1set nu- en lu%ar de -1set number- + para desacti'ar la opcin se suele usar la misma opcin precedida de -no- Por e&emplo -1set nonu- o -1set nonumber- ,as opciones !ue deben tomar un 'alor num5rico se establecen con el nombre de la opcin se%uida de -Q- + el 'alor Por e&emplo -1set tabstopQBCon5i/#racin el e i!or El fic"ero ms estndar para confi%urar -'i- en cual!uier () de tipo *ni$ es -\8 e$rc- Como alternati'a se puede usar fic"eros ms especficos para el editor concreto !ue estemos usando Por e&emplo en el caso de -'im- tenemos -\8 'imrc- Compruebe si e$iste un e&emplo -8etc8'imrc- en su ,inu$ + mire su contenido (e trata de un fic"ero de e&emplo para copiarlo en - \8 'imrc- Contiene al%unas confi%uraciones !ue pueden resultar tiles El carcter comilla doble -?- se usa para

considerar el resto de la lnea como un comentario (i considera !ue el editor tiene un comportamiento !ue usted considera incmodo !ui#s se deba a la e$istencia de al%unas opciones !ue no se adaptan al uso !ue usted da a su editor Por e&emplo para editar pro%ramas C puede resultar cmodo la autoG indentacin pero no le %ustar !ue parta las lneas automticamente cuando e$cedan un determinado anc"o Tambi5n es buena idea incluir en su fic"ero de confi%uracin las abre'iaturas + las macros !ue desee usar Xa "emos 'isto al%unas + se%uramente +a se "a pre%untado como "acer para no tener !ue introducirlas cada 'e# Es bueno perder un poco de tiempo en personali#ar el editor Ta/ Para editar fuentes C por e&emplo resulta mu+ practico (upon%amos !ue tenemos un fuente llamado pin%pon% c Crearemos en primer lu%ar un fic"ero ta%s e&ecutando ?cta%s pin%pon% c? ('er cta%s (C)) (e crea un fic"ero ta%s !ue contendr por e&emplo lo si%uiente1
plot salir pin&pon&+c pin&pon&+c [Yplot?x* y* chA$[ [Ysalir?sA$[

Con ello se referencian las funciones Para editar el fic"ero podemos "acer 'i Gtplot 2parecera el cursor en la posicin de esa funcin (i introducimos 1ta salir desde el modo de comandos nos situaremos en esa funcin (e pueden crear ta%s para 'arios fic"eros simultneamente mediante cta%s Y8Y _cf%` ('er cta%s(C)) De esta forma podramos editar cmodamente 'arios fuentes

P1OG1A-ACION S*ELL.SC1IPT %Primera par!e'


9ue es un s"ellGscript E&ecucin de un s"ellGscript directamente como un comando E&ecucin con la s"ellGactual E&ecutar en una subs"ell usando par5ntesis Paso de parmetros a un s"ellGscript Test

3#e es #n s+ell.scrip! Xa 'imos "ace al%unas lecciones una introduccin al interprete de comandos de ,inu$ (s"ell) Vamos a ampliar nuestros conocimientos sobre la s"ell + si bien antes consideramos a la s"ell como un interprete de comandos en esta leccin 'eremos !ue es muc"o ms !ue eso ,a s"ell de ,inu$ !ue 'amos a usar es la <as" !ue como +a di&imos es un supercon&unto de la <ourneG("ell (in lu%ar a dudas esta leccin le permitir dar un salto enorme en el apro'ec"amiento de su () ,inu$ Con esta leccin + las si%uientes nos acercamos al momento en !ue usted podr presumir ante al%unos de sus ami%os de "aber reali#ado en su flamante () cosas !ue ellos no saben "acer con =cindos. aun!ue ellos podran presumir de su "abilidad cerrando las 'entanas del =eneral Nailiure + del Doctor =uasn El len%ua&e s"ellGscript es mu+ 'erstil aun!ue "a+ !ue ad'ertir !ue es bastante ineficiente (on muc"o ms eficientes los pro%ramas escritos en len%ua&e C Este es el len%ua&e en el !ue se escribi el kernel de ,inu$ + otros muc"os () El <as" no es tan eficiente como el C El 'alor del len%ua&e s"ellGscript es !ue permite "acer cosas complicadas con mu+ poco esfuer#o en perfecta combinacin con una serie de comandos tambi5n mu+ potentes disponibles en ,inu$ Verdad !ue suena interesante P 2l%unas partes del () !ue no pertenecen al kernel estn escritas en s"ellGscript Por e&emplo muc"os comandos !ue se 'an e&ecutando en secuencia mientras el sistema arranca son pro%ramas reali#ados en s"ellGscript as !ue la ineficiencia no es nin%n obstculo para ciertas tareas Por el contrario para un administrador tener ciertos pro%ramas del sistema en s"ellGscript le permite retocarlos a su %usto con %ran facilidad

Despu5s de "acer lo%in en el sistema obtendremos una sesin con el interprete de comandos asociado a nuestro usuario (Esta asociacin fi%ura en el fic"ero -8etc8pass>d- &unto !ui#s con la cla'e encriptada + otras cosas) Decimos !ui#s por!ue la cla'e no siempre es %uardada en este fic"ero ,a ra#n es !ue pese a estar encriptada 8etc8pass>d es un fic"ero !ue cual!uiera puede leer + resulta ms se%uro otro sistema llamado s"ado> 9ue 8etc8pass>d sea le%ible nos permite consultar entre otras cosas cual es nuestra s"ell en el inicio de una sesin Desde esta sesin podemos ir introduciendo ordenes desde el teclado pero nuestro interprete de comandos no de&a de ser a su 'e# un pro%rama normal como cual!uier otro. as !ue si tu'i5ramos !ue teclear 'arias cosas podramos %uardar estas ordenes en un fic"ero + rediri%ir la entrada estndar de la s"ell para !ue tome la entrada desde el fic"ero en lu%ar de "acerlo desde el teclado Vamos a 'er un e&emplo para mostrar fec"a + "ora en letras %randes Teclee el comando si%uiente1
$ banner =date $2^H ^I$=

2"ora 'amos a practicar repasando un poco las nociones !ue +a 'imos en el primer captulo dedicado al s"ell script por!ue son conceptos !ue con'iene asentar Para ello 'amos a %uardar este comando en un fic"ero para poder e&ecutarlo cuando nos apete#ca Pre'iamente nos situamos en el directorio -8tmp- como es costumbre + nos ase%uramos de no estar usando el usuario root ni nin%n otro usuario con pri'ile%ios especiales
$ .os sit"amos en Mtmp $ cd Mtmp $ Xeneramos el 'ichero con el comando $ echo Obanner =date $2^H ^I$=O / 'ichero_ordenes $ Comprobamos el contenido del 'ichero $ cat 'ichero_ordenes banner B:MB8MBB 8BV8;V3B

ff Va+a ff Esto no es lo !ue !ueramos "acer Este comando siempre mostrara la misma fec"a + "ora + se%uramente no pretendamos eso Dado !ue "emos usado las dobles comillas se "a producido la e$pansin de la lnea de ordenes concretamente el operador %ra'e (i en lu%ar de las dobles comillas usramos las comillas simples no se "abra producido ese error pero e$isten +a comillas simples dentro del propio comando + la s"ell tomara el cierre de la comilla simple en un lu%ar !ue no es el !ue nosotros desebamos Todo esto lo comentamos a modo de repaso Entonces como tendramos !ue "aber %enerado este comando P 2!u es donde el listillo dice !ue usando un editor de te$to <ueno al fin de cuentas +a sabemos usar el -'i- no P <ueno pues 'amos primero a "acerlo sin editor ;ecuerda !ue mencionamos la posibilidad de escapar un solo carcter con el carcter -:- P @ntentemos de nue'o
$ Xeneramos el 'ichero con el comando $ echo Obanner Q=date $2^H ^I$Q=O / 'ichero_ordenes $ Comprobamos el contenido del 'ichero $ cat 'ichero_ordenes banner =date $2^H ^I$=

2"ora si Vamos a usar la s"ell de la misma forma !ue "aramos con un pro%rama normal rediri%iendo la entrada estndar desde este fic"ero Por lo tanto el fic"ero tiene tratamiento de datos + solo se re!uiere permiso de lectura para e&ecutarlo de esta forma
$ ERec"tamos $ bash % 'ichero_ordenes $ Iambi1n podemos eRec"tarlo de otra 'orma $ cat 'ichero_ordenes 7 bash

Para e&ecutarlo sin rediri%ir entrada salida podemos pasar como ar%umento el nombre del fic"ero Nue'amente solo "ar falta permiso de lectura

$ ERec"tar pasando el nombre del 'ichero como ar&"mento $ sh 'ichero_ordenes $,-.

E2ec#cin e #n s+ell.scrip! irec!amen!e como #n coman o Para e&ecutarlo directamente como un comando necesitamos darle permiso de e&ecucin
$ ERec"tar pasando el nombre del 'ichero como ar&"mento $ chmod 2x 'ichero_ordenes $ +M'ichero_ordenes $,-.

,o del - 8- antes del e&ecutable resultar necesario si el directorio donde se encuentra el e&ecutable no fi%ura en la 'ariable -0P2T/- En realidad ocurre al%o mu+ similar al caso anterior por!ue tambi5n se arranca una subGs"ell !ue toma como entrada el fic"ero Esto ocurre cuando la s"ell detecta !ue el e&ecutable est en formato de te$to (i se tratara de cdi%o binario lo e&ecutara sin arrancar una subGs"ell Para a'eri%uar !ue tipo de fic"ero se trata. la s"ell mirar los primeros crteres !ue contiene ,os fic"eros e&ecutables suelen tener un par de b+tes iniciales !ue ser'irn para identificar el tipo de fic"ero En caso contrario se asume !ue es un s"ellG srcip 2 estos dos caracteres iniciales &untos forman lo !ue se denomina nmero m%ico Es solo una cuestin de nomenclatura El () lo 'e como un nmero entero de dos b+tes + nosotros desde un editor lo 'emos como dos caracteres E$iste un pro%rama llamado -file- !ue utili#a esta informacin as como la presencia de ciertos patrones para identificar el tipo de un fic"ero (e usa el t5rmino script para fic"eros !ue son le%ibles + e&ecutables Es decir el propio fuente del pro%rama es e&ecutable Nuente de un pro%rama es lo !ue escribe el pro%ramador El len%ua&e C no es un len%ua&e tipo script +a !ue el fuente no es e&ecutable /ace falta un compilador !ue traduce el cdi%o fuente a cdi%o propio de la m!uina ,os (cript no se e&ecutan directamente en la m!uina sino dentro de un pro%rama !ue 'a interpretando las instrucciones <ueno en %eneral esto es ms o menos as /a+ muc"os tipos de scripts ,a s"ell tiene su propio len%ua&e E$iste un len%ua&e distinto llamado -perl- !ue tambi5n se e&ecuta como un script -perl- es un len%ua&e inspirado en el uso combinado del interprete de comandos + al%unos comandos clsicos de los () tipo *ni$. + adems incorpora cosas de otros len%ua&es como el -C- + otras cosas totalmente ori%inales -perl- no es fcil de aprender pero es un len%ua&e de script mu+ potente *n script de -perl- se puede e&ecutar mediante el comando -perl prueba pl- El fic"ero -prueba pl- deber estar en len%ua&e -perl- (i e&ecutramos directamente - 8prueba pl- desde bas". el interprete de comandos intentar e&ecutarlo como si fuera un script de bas" dando errores de sinta$is Para e'itar esto se puede poner totalmente al principio del fic"ero los caracteres -Uf- Estos caracteres sern 'istos como un nmero m%ico !ue a'isa !ue a continuacin 'iene el pro%rama a usar con ese script Para el script de perl debera "aber empe#ado con -Uf8usr8bin8perl- para poderlo e&ecutar directamente sin problema Para un script de bas" no es necesario poner nada pero podramos "aber puesto -Uf8bin8bas"-. o -Uf8bin8s"- De esta forma tambi5n se puede indicar cual es la s"ell !ue deseamos usar +a !ue podramos desear usar otras s"ells como -Uf8usr8bin8cs"- para la CGs"ell o -Uf8usr8bin8ks"- para la Oorn s"ell 2 nosotros con el bas" nos basta + sobra E2ec#cin con la s+ell.ac!#al /asta este momento siempre "emos arrancado una subGs"ell !ue lea las ordenes del fic"ero. las e&ecutaba + despu5s terminaba + mora cediendo el control nue'amente a la s"ell ori%inal !ue arranc la subGs"ell E$iste una forma de decirle a la s"ell actual !ue lea + e&ecute una serie de ordenes por si misma sin arrancar una subGs"ell Para ello "a+ !ue anteponer un punto + un blanco al nombre del comando

Nue'amente solo "ar falta permiso de lectura


$ ERec"tar ordenes de "n 'ichero desde la shell act"al $ + +M'ichero_ordenes

En este caso no se "a e&ecutado mediante una subGs"ell pero no se aprecia nin%una diferencia Esto no siempre es as Veamos un e&emplo en el !ue se aprecie la diferencia 00 tomar el 'alor del pid de la s"ell en e&ecucin + 0PP@D tomar el 'alor del pid del proceso padre
$echo echo Q$!!-H Q$$ / 'ichero_ordenes $ bash 'ichero_ordenes 8@3 83D; $ + +M'ichero_ordenes @ 8@3

E'identemente cuando pruebe este e&emplo obtendr un pid distinto de 43L pero lo interesante es 'er como ambas e&ecuciones establecen claramente !ue la primera fue efectuada por un proceso "i&o de la s"ell !ue se e&ecuta en se%undo lu%ar usando el punto. se%uido del espacio + del -fic"eroJordenes,os procesos "i&os "eredan el entorno ('ariables + otras cosas) desde el proceso padre por lo cual un padre si puede comunicarse con su "i&o de esa forma Por el contrario un proceso "i&o (subGs"ell en nuestro caso) &ams puede comunicarse de esa forma con su padre ;esulta imposible !ue un proceso "i&o comuni!ue 'alores de 'ariables del entorno a su padre (i deseamos modificar 'ariables del entorno e&ecutando un s"ellGscript no podremos "acerlo nunca si la e&ecutamos desde dentro de una subGs"ell Por el contrario deberemos usar al%o del tipo - 8fic"eroJordenes- como acabamos de 'er E$iste un fic"ero en el directorio inicial de cada usuario !ue consiste en una serie de ordenes iniciales para s"ell En el caso de la <as" este fic"ero es -\8 bas"Jprofile- Podemos e&ecutarlo si !ueremos pero este tipo de fic"eros inclu+en ordenes para iniciali#ar 'ariables entre otras cosas. as !ue lo adecuado sera e&ecutarlo desde la s"ell actual /a%a lo si%uiente1
$ cd $ + +M+bash_pro'ile

)bser'e !ue "a+ tres puntos en el ltimo comando con tres si%nificados distintos El primero es para e&ecutar con la s"ellGactual. el se%undo es para indicar el directorio actual. + el ltimo forma parte del nombre + se usa para !ue no sea tan 'isible dado !ue un punto al principio del nombre de un fic"ero no ser e$pandido por la s"ell cuando usemos -YVamos a comprobar la accin del nmero m%ico Pase a un directorio para practicar sus e&ercicios. + edite un nue'o fic"ero !ue debe llamarse -a'isoecho OError este shell0script debi) arrancarse con + McomandoO

2"ora edite otro nue'o fic"ero !ue llamaremos -comandobMbinMbash MtmpMaviso echo OCOKA.HOO

Vamos a e&ecutar nuestro s"ellGscript de dos formas distintas + obser'amos !ue el resultado no es el mismo En el se%undo caso se e&ecuta el script -a'iso- Este ltimo e&emplo no es completo +a !ue -8bin8bas" 8tmp8a'iso- no actuar interpretando sino de una forma independiente del te$to + mostrar siempre un mensa&e de a'iso

$ ?@A <e eRec"ta "sando "na s"b0shell pero en este $ caso se pasa "n ar&"mento a la s"b0shell y por ello $ no se eRec"ta el c)di&o del 'ichero comando+ $ chmod 2x aviso $ +Mcomando Error este shell0script debi) arrancarse con + Mcomando $ ?8A Ahora eRec"tamos con la shell act"al

$ + +Mcomando COKA.HO

,a e$plicacin es la si%uiente El nmero m%ico indica con !ue s"ell se e&ecutar el script Nosotros "emos puesto en lu%ar una s"ell sin ar%umetos !ue e&ecutara ese te$to una s"ell !ue recibe un ar%umento Eso "ace !ue se e&ecute el comando pasado como ar%umento en lu%ar de tomar el te$to del fic"ero !ue contiene el nmero m%ico Cuando e&ecutamos con la s"ell actual la informacin si%uiente al nmero m%ico no ser tenida en cuenta por!ue supondra arrancar una subGs"ell Es un e&emplo rebuscado pero "a+ !ue intentar comprender lo !ue sucede en distintas situaciones por!ue el len%ua&e s"ellGscript tiene sus rare#as E2ec#!ar en #na s#bs+ell #san o par;n!esis Xa !ue estamos con el tema de la subs"ell 'amos a comentar como funciona el uso de los par5ntesis desde la linea de rdenes No es necesario reali#ar un script para e&ecutar al%o en una subs"ell (lista) E&ecuta una lista de ordenes en una subs"ell
$ var@=::: $ ? var@=@@@P echo $var@ A @@@ $ echo $var@ :::

Estamos a'an#ando mu+ deprisa. + por eso tenemos !ue practicar bastante para consolidar los conocimientos No siempre resulta tri'ial a'eri%uar como funcionan las cosas )bser'e el si%uiente e&emplo1
$ echo $$ P ? echo $$ P ? echo $$ A A 8@: 8@: 8@:

Nue'amente el resultado puede ser distinto en su ordenador pero lo importante es !ue -ec"o 00parece obtener el mismo pid pese a ocurrir en distintas subGs"ells Cuando parece ocurrir al%o distinto de lo !ue nosotros esperbamos resulta mu+ til usar el modo tra#a con -set G$- ;epetimos el e&emplo misterioso de antes
$ set 0x $ echo $$ P ? echo $$ P ? echo $$ A A 2 echo 8@: 8@: 2 echo 8@: 8@: 2 echo 8@: 8@: $ set 2x

7isterio aclarado ;ealmente no e&ecutamos nin%n -ec"o 00- sino !ue +a se e&ecuta directamente

-ec"o 43E- por!ue la s"ell lo primero !ue "i#o antes de e&ecutar las ordenes fu5 e$pandir cada -00presente en la lnea de ordenes 2"ora !ue +a sabemos !ue es un s"ellGscript 'amos a ir aprendiendo cosas pero no se pretende una descripcin e$"austi'a de la <as" Puede consultar con man bas" las dudas !ue ten%a ;ecuerde !ue el man no es una "erramienta de estudio sino de consulta Cuando consulte -man bas"- 'er cantidad de informacin relati'a a cosas !ue no "emos e$plicado + man no e$plica casi nada Por ello muc"as cosas de -man bas"- no las enteder aun!ue siempre !ueda el recurso de probar las cosas !ue no se comprenden para 'er como funcionan (e irn proponiendo e&emplos !ue ilustren unas cuantos conceptos bsicos *na 'e# !ue "a+a practicado con estos e&emplos "abremos conse%uido dar los primeros pasos en la pro%ramacin de s"ellGscript !ue son los !ue ms cuestan Despu5s un buen m5todo para continuar aprendiendo a pro%ramar en s"ellGscript es intentar comprender las s"ellGscript !ue encontremos en el sistema con a+uda del manual online de uni$ El len%ua&e s"ellGscript es un poco especial con relacin a otros len%ua&es +a !ue los blancos + los saltos de lnea tienen un si%nificado !ue "a+ !ue respetar + la e$pansin de ordenes es al%o !ue puede resultar desconcertante Eso lo "ace un poco antiptico al principio Es importante tener una buena base de conocimientos !ue en estos momentos +a tenemos. + continuar practicando Paso e parme!ros a #n s+ell.scrip! @ma%inemos !ue usted tiene dificultad para pasar de Ptas a Euros. + !uiere "acer un pro%ramita para pasar de una moneda a otra cmodamente Edite el comando si%uiente. + lue%o e&ecutelo en la forma -pta4eu LB-1
pta8e" echo $@ $M @;;+3:;$ 7 bc 0l

En este caso 03 acta como una 'ariable !ue tomar el 'alor del primer parmetro 0D toma el 'alor del propio comando e&ecutado + 04. 0L etc el 'alor de los parmetros se%undo + tercero respecti'amente ,a 'ariable 0U tomar el 'alor del nmero de parmetros !ue usemos ,a 'ariable 0Y toma el 'alor de todos los parmetros concatenados Vamos a poner un e&emplo !ue llamaremos -pruJparametros- Debe editarlo. darle permisos de e&ecucin con c"mod R$ por e&emplo + e&ecutarlo pasando distintos parmetros - 8pruJparametros-. - 8pruJparametros "ola-. - 8pruJparametros pararm3 param4 paramLpr"_parametros echo O."mero de parFmetros = $ O echo $$B=$ $B echo $$@=$ $@ echo $$8=$ $8 echo $$3=$ $3 echo $$4=$ $4

,a e&ecucin de esta prueba !uedara como si%ue

$ +Mpr"_parametros ."mero de parFmetros = B $B= +Mpr"_parametros $@= $8= $3= $4= $ +Mpr"_parametros hola ."mero de parFmetros = @ $B= +Mpr"_parametros $@= hola $8= $3= $4= hola $ +Mpr"_parametros pararm@ param8 param3 ."mero de parFmetros = 3 $B= +Mpr"_parametros $@= pararm@ $8= param8 $3= param3 $4= pararm@ param8 param3 $

No e$iste la posibilidad de usar 03D para acceder al parmetro d5cimo En lu%ar de acceder de esta forma "abra !ue usar un comando interno llamado -s"ift- El efecto de este comando es despla#ar los ar%umentos una posicin De esta forma 03 se pierde + 04 pasar a ser 03. 0L pasar a ser 04. etc (i e$istan ms de 3D parmetros a"ora el d5cimo !ue antes era inaccesible pasar a ser 0F 0D no 'ara (e pueden despla#ar 'arios parametros de un %olpe pasando un nmero a la funcin -s"iftpor e&emplo -s"ift B- despla#ara a B parmetros Vamos a editar un fic"ero de e&emplo !ue llamaremos -pruJs"ift-1 Debe editarlo. darle permisos de e&ecucin con -c"mod R$ pruJs"ift- + e&ecutarlo pasando distintos parametros - 8pruJs"ift pararm3 param4 paramL- )bser'e !ue es una prueba parecida a la anterior @ntente utili#ar sus conocimientos de 'i para no tener !ue teclear tanto ;ecuerde !ue puede leer un fic"ero desde dentro del editor + !ue puede duplicar blo!ues de informacin de 'arias formas
pr"_shi't echo O."mero de parFmetros = $ O echo $$B=$ $B echo $$@=$ $@ echo $$8=$ $8 echo $$3=$ $3 echo $$4=$ $4 shi't echo O."mero de parFmetros = $ O echo $$B=$ $B echo $$@=$ $@ echo $$8=$ $8 echo $$3=$ $3 echo $$4=$ $4

,a e&ecucin de esta prueba !uedara como si%ue

$ +Mpr"_shi't

pararm@ param8 param3

."mero de parFmetros = 3 $B= +Mpr"_shi't $@= pararm@ $8= param8 $3= param3 $4= pararm@ param8 param3 ."mero de parFmetros = 8 $B= +Mpr"_shi't $@= param8 $8= param3 $3= $4= param8 param3

P1OG1A-ACION S*ELL.SC1IPT %Primera par!e'


Nunciones Cdi%os de retorno Comandos true + false Comando test Comando e$pr E$presiones aritm5ticas dentro de <as" )peradores TT + HH Test

9#nciones (e pueden definir funciones !ue podrn ser llamadas por su nombre permitiendo el paso de parmetros de la misma forma !ue cuando se llama a una s"ell Tambi5n puede de'ol'er cdi%os de retorno ,as 'ariables alteradas dentro de una funcin tienen efecto 'isible fuera de la funcin +a !ue una funcin no se e&ecuta in'ocando a una subGs"ell *na funcin se puede definir en un s"ellG script o en la propia linea de comandos (i se "ace esto ltimo ser como si a6adi5ramos un comando interno
$ '''?A c echo O000000000000000000000000000O P d $ ''' 000000000000000000000000000

(i tecleamos -set- despu5s de esto 'eremos todas las 'ariables definidas + tambi5n aparecer esta funcin !ue acabamos de crear
$ set

2"ora 'amos a editar un s"ellGscript !ue use una funcin Edite un fic"ero !ue llamaremos -pruJfuncion3- !ue ten%a lo si%uiente
pr"_'"ncion@ ,"ncion #"e m"estra dos parametros de entrada y modi'ica "na variable '"ncion@?A c echo $%$$@$/$ echo $?$$8$A$ var=@83C d main '"ncion@ @@@ 888 echo $var

2"ora damos permisos de e&ecucin + e&ecutamos simplemente mediante - 8pruJfuncion3$ +Mpr"_'"ncion@ %@@@/ ?888A 33 @83C

Edite + pruebe el si%uiente cdi%o


Vis"ali(ar los parametros del ; al @C '"nction?A c shi't E echo $@ $8 $3 $C $E $; $3 $: $D d main '"ncion @ 8 3 C E ; 3 : D @B @@ @8 @3 @C @E @; @3

Para definir la sinta$is de una funcin en s"ellGscript podramos usar lo si%uiente1


_nombre_funcion_ () { _lista_de_ordenes_ }

*na lista de ordenes sera una o ms ordenes separadas por al%n operador como por e&emplo -S-. -HH-. -TT-. -T- o ;ecuerde !ue el s"ellGscript tiene un si%nificado similar a -S- + si desea suprimir este si%nificado deber preceder inmediatamente con -:- para escapar el carcter + !ue no sea interpretado por la s"ell En una cadena delimitada por comillas simples o dobles no tiene este si%nificado pero puede usarse -:- para e'itar !ue el carcter !uede insertado en la cadena
$ echo Q / >>>Q / xxx >>>xxx

C i/os e re!orno ,a palabra reser'ada -return- interrumpe la e&ecucin de una funcin asi%nando un 'alor al cdi%o de retorno de esa funcin (u uso no es necesario al final de la funcin ,a palabra reser'ada -e$ittermina la e&ecucin de un s"ellGscript liberando recursos + de'ol'iendo un cdi%o de retorno el int5rprete de comandos -e$it D- terminar retornando cero (i solo ponemos -e$it- el cdi%o retornado ser como si "ici5ramos -e$it 0P- Es decir retorna el 'alor del ltimo comando 2"ora edite un fic"ero !ue llamaremos -pruJfuncion4- !ue ten%a lo si%uiente
pr"_'"ncion8 ,"ncion #"e dev"elve "n c)di&o de retorno+ J shell #"e dev"elve otro '"ncion8?A c var=@83C ret"rn 33 var=CE;3 d main '"ncion8 echo $[ echo $var exit :::

E&ecutaremos este e&emplo


$+Mpr"_'"ncion8 33 @83C

Coman os !r#e 4 5alse ,os comandos !ue finali#an correctamente suelen retornar D ,os !ue finali#an con al%n error suelen retornar un 'alor distinto de D + de esa forma distintos cdi%os de retorno pueden indicar distintas causas de error o no 5$ito En una e$presin l%ica donde lo !ue interesa es simplemente distin%uir entre al%o !ue se cumple o !ue no se cumple se tomar D como 'alor l%ico T;*E (o sea cierto) + distinto de D se tomar como N2,(E (falso) -true- + -false- son comandos !ue no "acen nada (implemente retornan el 'alor l%ico T;*E o N2,(E respecti'amente El 'alor de 0P siempre de'uel'e el ltimo cdi%o de retorno obtenido por la s"ell despu5s de e&ecutar el ltimo comando E&emplos1
$ tr"e P echo $[ B $ 'alse P echo $[ @

Esperamos !ue e&emplos tan complicados como estos dos ltimos no le desanimen para continuar con el curso Coman o !es! Como +a di&imos el len%ua&e s"ellGscript utili#a mu+ frecuentemente comandos e$ternos del sistema operati'o 9ueremos e$plicar el comando -test- antes de e$plicar las sentencias condicionales de bas" por!ue de esta forma podremos usar e&emplos ms completos -test- es un comando e$terno !ue de'ol'er un cdi%o de retorno D o 3 dependiendo del resultado de la e$presin !ue si%a a continuacin (e usa muc"simo + tiene dos formatos -test Ie$prK- o -_ Ie$prK `- ambas formas son e!ui'alentes ,as e$presiones de este tipo !ue solo pueden 'aler T;*E o N2,(E se denominan e$presiones l%icas Comprobacin sobre fic"eros Gr Ific"eroK G> Ific"eroK G$ Ific"eroK Gf Ific"eroK Gd Ific"eroK Gc Ific"eroK Gb Ific"eroK Gp Ific"eroK Gu Ific"eroK T;*E si el fic"ero e$iste + es le%ible T;*E si el fic"ero e$iste + se puede escribir T;*E si el fic"ero e$iste + es e&ecutable T;*E si el fic"ero e$iste + es de tipo re%ular (normal) T;*E si e$iste + es un directorio T;*E si e$iste + es un dispositi'o especial de caracteres T;*E si e$iste + es un dispositi'o especial de blo!ues T;*E si e$iste + es un pipe (fifo) T;*E si e$iste + tiene el bit setGuserG@D

Gs Ific"eroK

T;*E si e$iste + tiene tama6o ma+or !ue D Comparacin de cadenas

G# IcadenaK Gn IcadenaK Icadena3K Q Icadena4K Icadena3K fQ Icadena4K IcadenaK

T;*E si es una cadena 'aca T;*E si es una cadena no 'aca T;*E si ambas cadenas son id5nticas )d) "a+ de&ar espacios a un lado + otro del si%no i%ual para no confundir la orden con una asi%nacin T;*E si son distintas T;*E si no es cadena nula (*na 'ariable !ue no e$iste de'uel'e cadena nula) Comparacin de nmeros

Inum3K Ge! Inum4K Inum3K Gne Inum4K Inum3K G%t Inum4K Inum3K G%e Inum4K Inum3K Glt Inum4K Inum3K Gle Inum4K

T;*E si ambos nmeros son i%uales T;*E si ambos nmeros son distintos T;*E si Inum3K ma+or !ue Inum4K T;*E si Inum3K ma+or o i%ual !ue Inum4K T;*E si Inum3K menor !ue Inum4K T;*E si Inum3K menor o i%ual !ue Inum4K )peradores l%icos

f Ie$presinJlo%icaK IE$pr,o%i3K Ga IE$pr,o%i4K IE$pr,o%i3K Go IE$pr,o%i4K

)perador l%ico N)T retorna T;*E si Ie$presinJlo%icaK es N2,(E + retorna N2,(E si Ie$presinJlo%icaK es T;*E )perador l%ico 2ND retorna T;*E si IE$pr,o%i3K + IE$pr,o%i4K son ambas T;*E + N2,(E en caso contrario )perador l%ico ); retorna T;*E si IE$pr,o%i3K o IE$pr,o%i4K son al%una de ellas T;*E + N2,(E en caso contrario 2%rupacin de e$presiones

( Ie$prK ) E&emplos1

(e pueden usar par5ntesis para a%rupar e$presiones l%icas Es decir !ue 'al%an T;*E o N2,(E

$ test 0r MetcMpasswd P echo $[ B $ test 0w MetcMpasswd P echo $[ @ $ test 0x MetcMpasswd P echo $[ @ $ test 0c MdevMn"ll P echo $[

B $ test 0r MetcMpasswd 0a 0c MdevMn"ll P echo $[ B $ test 0w MetcMpasswd 0a 0c MdevMn"ll P echo $[ @ $ test 0r MetcMpasswd 0a 0' MdevMn"ll P echo $[ @ $ 5 0s MdevMn"ll 6 P echo $[ @ $ 5 b 0s MdevMn"ll 6 P echo $[ B $ 5 O$$O = O((((((((((((O 6 P echo $[ @ $ 5 B 0lt $$ B $ 5 B 0lt $$ 6 P echo $[ 0a tr"e 6 P echo $[

Coman o e,pr Este comando admite como parmetros los elementos de una e$presin aritm5tica pero "a+ !ue recordar !ue al%unos operadores deben ser escapados con -:- Por e&emplo
$ expr @@ Q4 8

2 diferencia de -bc- no podemos usar 'alores demasiado altos por!ue el resultado no sera correcto ;ecuerde !ue -bc- traba&a con precisin arbitraria El comando -e$pr- es til pero no de&a de ser un comando e$terno + por lo tanto su uso resulta ineficiente 2fortunadamente la propia s"ell tiene capacidad de e'aluar e$presiones aritm5ticas E,presiones ari!m;!icas en!ro e Bas+ ,a s"ell por defecto asume !ue todas las 'ariables son de tipo cadena de caracteres Para definir una 'ariable de tipo num5rico se usa -t+peset Gi- Esto a6ade un atributo a esa 'ariable para !ue la s"ell realice una e$pansin distinta sobre esta 'ariable Para e'aluar una e$presin aritm5tica asi%nndola a una 'ariable usaremos -letGR Y8V RG IQ KQ I K QQ fQ 7enos unrio + 7s unrio 7ultiplicacin. Di'isin. + ;esto (uma. + ;esta Comparaciones 7enor o i%ual. 7a+or o i%ual. 7enor. 7a+or @%ualdad. desi%ualdad

Q YQ 8Q VQ RQ GQ E&emplos1
$ $ $ $

2si%nacin simple. 2si%nacin con operador (multiplicacin. di'isin. resto. suma. + resta)

typeset 0i R=3 typeset 0i > typeset 0i m echo $R

3 $ let R=R23 $ echo $R @B $ let R2=3 $ echo $R @3 $ let >=R^3 $ let m=RM3 $ echo $?$ $m $4 3 A 2$ $> $=$ $R 2AKA ? C 4 3 A 2 @ = @3

Puede !ue el operador -V- no le resulte familiar Es el operador resto tambi5n se llama mdulo + es lo !ue sobra despu5s de la di'isin ,o cierto es !ue es preferible continuar e$plicando otras cosas + ms adelante tendremos oportunidad de poner al%unos e&emplos con e$presiones aritm5ticas /a+ una serie de operadores !ue traba&an a ni'el de bits pero no 'amos a e$plicarlos de momento Opera ores KLLK 4 KEEK (on operadores 2ND + ); a ni'el de s"ell + poseen circuito de e'aluacin corto No tienen !ue 'er con los operadores Ga + Go +a !ue estos eran interpretados por el comando -test- Estos operadores -TT- + -HH- sern colocados separando comandos !ue l%icamente retornan siempre al%n 'alor -Icomando3K TT Icomando4K TT IcomandoLK- si%nifica !ue debe cumplirse Icomando3K + Icomando4K + IcomandoLK para !ue se cumpla la e$presin + -Icomando3K HH Icomando4K HH IcomandoLK- si%nifica !ue debe cumplirse Icomando3K o Icomando4K o IcomandoLK para !ue se cumpla la e$presin (i el resultado de -Icomando3K TT Icomando4K TT IcomandoLK- fuera D (T;*E) si%nificara !ue los tres comandos "an retornado D (T;*E) (i por el contrario el resultado "ubiera sido distinto (N2,(E) solo sabramos !ue por lo menos uno de los comandos retorn N2,(E (upon%amos !ue el primer comando retorn T;*E ,a s"ell deber continuar e&ecutando el se%undo comando (upon%amos !ue el se%undo comando retorna N2,(E En este momento la s"ell no continua e&ecutando el tercer comando por!ue da i%ual lo !ue retorne el resultado ser N2,(E ,a ra#n es !ue se necesitaban todos T;*E para un resultado T;*E El "ec"o de no e&ecutar las partes si%uientes una 'e# se sabe el resultado es lo !ue se llama circuito de e'aluacin corto + su uso principal es el de a"orrar e&ecuciones de ordenes innecesarias aun!ue se puede usar tambien para e&ecutar cosas solo ba&o ciertas condiciones Con el operador -HH- ();) pasa al%o similar (i el resultado de -Icomando3K HH Icomando4K HH IcomandoLK- fuera 3 (N2(E) si%nificara !ue los tres comandos "an retornado 3 (N2,(E) (i por el contrario el resultado "ubiera sido distinto D (T;*E) solo sabramos !ue por lo menos uno de los comandos retorn T;*E (upon%amos !ue el primer comando retorn N2,(E ,a s"ell deber continuar e&ecutando el se%undo comando (upon%amos !ue el se%undo comando retorna T;*E En este momento la s"ell no continua e&ecutando el tercer comando por!ue da i%ual lo !ue retorne el resultado ser T;*E (e necesitaban todos N2,(E para un resultado N2,(E *n comando normal como por e&emplo -%rep- o -ec"o- !ue termina bien de'uel'e T;*E (i

"ubi5ramos rediri%ido la salida de -%rep-o de -ec"o- a un fic"ero sin permiso de escritura o a un fic"ero con un pat" ine$istente el retorno de -%rep- o de -ec"o- "abra sido N2,(E indicando la e$istencia de error En otras ocasiones N2,(E no indicar error sino !ue el comando no tu'o 5$ito Esto ltimo sera aplicable a -%rep- (patrn locali#ado o no locali#ado) pero no sera aplicable a un comando como -ec"oVeamos un e&emplo con -%rep$ echo hola 7 &rep hola P echo $[ hola B $ echo hola 7 &rep hola / MhhMhhMhh P echo $[ bashV MhhMhhMhhV .o existe el 'ichero o el directorio @ $ echo xxx 7 &rep hola P echo $[ @

Cuando e&ecutamos comandos con un pipe (-H-) el cdi%o de retorno es el del ltimo comando e&ecutado En nuestro caso el primer cdi%o 3 se debe a la imposibilidad de %enerar la salida El se%undo cdi%o 3 se debe a !ue la cadena no fue encontrada En los tres casos 0P reco%e el cdi%o retornado por -%rep2"ora 'amos a probar e&emplos !ue ilustren el circuito de e'aluacin corto Primero para );
$ Como "n OR #"eda eval"ado c"ando se enc"entra el primer res"ltado IRLE $ solo se eval"aran los comandos hasta obtener el primero #"e dev"elva $ B ?IRLEA $ echo OholaO 77 echo Oadi)sO hola $ El res"ltado sera B $ echo $[ B

2"ora para 2ND


$ Como "n A.H no #"eda hasta #"e se evalGa el primer res"ltado ,AT<E $ se eval"aran los dos comandos y devolverF i&"almente IRLE+ $ echo OholaO `` echo Oadi)sO hola adi)s $ El res"ltado sera B $ echo $[ B

El circuito de e'aluacin corto "a de usarse correctamente (i sabemos !ue un comando dar casi siempre un resultado !ue puede "acer innecesario la e&ecucin de otros comandos lo colocaremos en primer lu%ar ,os comandos lentos se colocan en ltimo lu%ar por!ue de esa forma puede no ser necesario e&ecutarlos 2l%unas 'eces no nos interesa un resultado sino solo !ue se e&ecute una orden dependiendo del resultado de otra orden Es decir !ueremos e&ecutar solo si se cumple una condicin
$ test b 0w 'ichero `` echo OC"idado 'ichero sin permiso de escrit"raO $ test 0w 'ichero 77 echo OC"idado 'ichero sin permiso de escrit"raO

P1OG1A-ACION S*ELL.SC1IPT %Tercera par!e'


(entencia condicional -if(etencia condicional -caseEntrada de datos con read <ucles ->"ile- + -until<ucle -for-break- + -continue2rre%los *n e&empo sencillo1 Construccin de un menu El coste de los comandos e$ternos ;ecomendaciones finales

Sen!encia con icional Ki5K Xa "emos 'isto una forma de "acerlo usando los operadore -HH- o -TT- de la s"ell. pero e$isten formas !ue pueden resultar ms 'ersatiles + ms le%ibles
if _condicin_ then _lista_de_ordenes_ [ elif _condicin_ then _lista_de_ordenes_ ] ... [ else _condicin_ ]

fi

En lu%ar de _condicin_ podramos "aber puesto _lista_de_ordenes_ pero !ueremos resaltar !ue el cdi%o de retorno 'a a ser e'aluado ,as partes entre corc"etes son opcionales + si 'an se%uidas de tres puntos - - indica !ue puede presentarse 'arias 'eces Todas las sentencias condicionales -if- empie#an con la palabra reser'ada -if- + terminan con la palabra reser'ada -fi7e&or 'amos a ilustrar con al%unos e&emplos Deber editarlos + e&ecutarlos
Esto siempre mostrara $@83$ i' tr"e then echo $@83$ 'i

2cabamos de utili#ar una condicin !ue siempre se cumplir Vamos a 'er al%o un poco ms util
<i la variable CK!RIB@ estF de'inida y contiene el nombre de "n 'ichero con permiso de lect"ra se mandarF a la impresora con $lp$ i' test 0r $CK!RIB@ then lp $CK!RIB@ 'i

Tambi5n podemos pro%ramar una accin para cuando se cumpla una condicin + otra para cuando no se cumpla
<i Ta variable $modo$ contiene el valor $lp$ imprimir el 'ichero $,-CH en caso contrario sacarlo por pantalla+ i' 5 O$modoO = OlpO 6 then lp $,-CH else cat $,-CH 'i

El si%uiente e&emplo editelo con el nombre -tipofic"ero- Nos ser'ir para ilustrar el uso de -elif- + para repasar al%unas de las opciones de -test-

tipo'ichero ,-TE=$@ i' test 0b $,-TE then echo $,-TE $Es "n dispositivo de blo#"es$ eli' test 0c $,-TE then echo $,-TE $Es "n dispositivo especial de caracteres$ eli' test 0d $,-TE then echo $,-TE $Es "n directorio$ eli' test 0' $,-TE then echo $,-TE $Es "n 'ichero re&"lar ?ordinarioA$ eli' test 0T $,-TE then echo $,-TE $Es "n Tin> simb)lico$ eli' test 0p $,-TE then echo $,-TE $Es "n pipe con nombre$ eli' test 0< $,-TE then echo $,-TE $Es "n <oc>et ?dispositivo de com"nicacionesA$ eli' test 0e $,-TE then echo $,-TE $Existe pero no sabemos #"e tipo de 'ichero es$ else echo $,-TE $.o existe o no es accesible$ 'i

Para usar este ltimo e&emplo e&ectute - 8tipofic"ero - o - 8tipofic"ero tipofic"eroTen%a en cuenta !ue si bien la -bas"- admite el uso de -elif- !ui#as otras s"ell no lo admitan Se!encia con icional KcaseK Xa "emos 'isto !ue con -elif- podemos e'aluar distintas condiciones pro%ramando una accin para cada caso E$iste un caso especial @ma%inemos !ue deseamos e'aluar una 'ariable + en funcin de lo !ue conten%a "acer una cosa u otra Podramos usar una sentencia condicional con abundantes -elif- pero "a+ !ue tener en cuenta una cosa Con -elif- tenemos !ue ir e'aluando a cada paso "asta !ue se cumpla una 'e# + entonces se e&ecuta la accin + +a no se e&ecuta nin%una otra por!ue "abremos finali#ado En el caso anterior si "ubieramos introducido el nombre de un pipe con nombre se "abran e&ecutado 'arios test antes de determinar !ue era un pipe con nombre. + eso resulta lento (i lo !ue deseamos "acer est en funcin de un 'alor utili#aremos la sentencia condicional -case- !ue es muc"o ms eficiente por!ue no re!uiere e&ecutar 'arias ordenes o una orden 'arias 'eces como en el caso anterior ,a sinta$is para la sentencia condicional -case- sera de la si%uiente forma1
case valor in [ _lista_de_patrones_ ) _lista_de_ordenes_ ;; ] ... esac

Por 'alor !ueremos indicar el resultado de cual!uier e$pansin producida por la s"ell ,a JlistaJdeJpatronesJ son uno o ms patrones separados por el caracter -H- + cada patrn es del mismo tipo !ue los patrones utili#ados para la e$pansin de nombres de fic"eros El orden es importante por!ue se 'an comprobando por orden + en el momento !ue uno de los patrones corresponda con el 'alor se e&ecutar la _lista_de_ordenes_ !ue le corresponda + +a no se e&ecutar nada ms Es frecuente utili#ar en ltimo lu%ar un patrn -Y)- para !ue en caso de no encontrar nin%una correspondencia con los patrones anteriores se e&ecute siempre una accin por defecto Edite el si%uiente e&emplo + sal'elo con nombre -pruebaJcase-

pr"eba_case case $@ in @A echo Lno PP 8A echo Hos PP 53036A echo OEntre tres y siete ambos incl"idosO PP :7D7BA echo OchoP echo ."eveP echo Cero PP 5a0(A0U6A echo Lna Tetra PP start7be&inA echo Comien(o PP stop7endA echo ,in PP 4A echo $,allo$ esac

2"ora le damos permiso de e&ecucin + probamos como funciona


$ +Mpr"eba_case @ Lno $ +Mpr"eba_case 8 Hos $ +Mpr"eba_case 3 Entre tres y siete ambos incl"idos $ +Mpr"eba_case h Lna Tetra $ +Mpr"eba_case start Comien(o $ +Mpr"eba_case be&in Comien(o $ +Mpr"eba_case aa ,allo $ +Mpr"eba_case @8 ,allo $ +Mpr"eba_case D Ocho ."eve Cero $ +Mpr"eba_case stop ,in

;ecuerde !ue la e&ecucin de una orden e$terna en un s"ellGsrcipt es una operacin costosa /acer un script ineficiente puede no tener nin%una importancia dependiendo del uso !ue le demos + de lo sobrada de recursos !ue est5 la m!uina. pero en otros caso si ser ms importante as !ue "aciendo las cosas lo me&or posible estaremos preparados en un futuro para traba&os ms e$i%entes En!ra a e a!os con rea ,a instruccin -read- permite capturar datos desde la entrada estandar Para ello !ueda a la espera de un fin de linea Edite el fic"ero si%uiente + llamel -pruJreadecho 0e O-ntrod"(ca s" nombre V QcO read .OKSRE banner Hola $.OKSRE

E&ecute - 8pruJread- )bser'e !ue los datos introducidos son %uardados en la 'ariable N)7<;E (i pulsa directamente la 'ariable tomar 'alor ?? Cuando se usa la instruccin -read- sin una 'ariable el contenido se %uardar en la 'ariable ;EP,X pero si lo !ue desea es %uardar el contenido !ueda ms claro %uardarlo en una 'ariable concreta

7s adelante 'eremos e&emplos !ue usan esta instruccin B#cles K<+ileK 4 K#n!ilK
while _condicin_ do _lista_de_ordenes_ done

En lu%ar de _condicin_ podramos "aber puesto _lista_de_ordenes_ pero !ueremos resaltar !ue el cdi%o de retorno 'a a ser e'aluado 7ientras se cumpla la condicin se e&ecutar _lista_de_ordenes_ ;esulta e'idente !ue si dentro de la _lista_de_ordenes_ no "a+ nada capa# de alterar la condicin. resultar un blucle !ue se e&ecutar de forma ininterrumpida (<ucle infinito) (i esto ocurre "abr !ue matar el proceso en'iando al%una se6al E$iste un bucle mu+ similar + !ue solo se diferencia en !ue no para nunca "asta !ue se cumpla la condicin Es decir &usto al re'5s !ue antes
until _condicin_ do _lista_de_ordenes_ done

Edite como -pruJ>"ile3- el si%uiente e&emplo


pr"_while@ Hacer "n b"cle de capt"ra por consola ?terminara c"ando se p"lse solo %-.IRO/ A y mostrar el res"ltado de cada capt"ra entre parentesis+ -niciali(amos primero la variable T-.EA con "n valor c"al#"iera pero distinto de OO T-.EA=OxO while test $T-.EA do read T-.EA echo $?$$T-.EA$A$ done

Cuando pulsemos I@NT;)K directamente sin nada ms ,@NE2 'aldr ?? + -test 0,@NE2- de'ol'er N2,(E + el bucle finali#ar Vamos a e&ecutar el e&emplo para comprobar su funcionamiento
$ +Mpr"_while@ aaaaa ?aaaaaA bbbbb ?bbbbbA ?A

Vemos !ue en la ltima e&ecucin ,@NE2 'ala ?? B#cle K5orK (e proporciona una lista de elementos + se e&ecuta una lista de rdenes "aciendo !ue una 'ariable 'a+a tomando el 'alor de cada uno de estos elementos Entre estas ordenes se puede utili#ar un

nue'o bucle -forEl si%uiente e&emplo funciona pero es una mala idea +a !ue supone Varias e&ecuciones de un comando cuando se poda "aber "ec"o con uno solo /abra sido me&or "acer -c"mod R$ Y'or i in $4 do chmod 2x done

$i

El si%uiente e&emplo no funcionar si no prepara un poco una serie de cosas !ue se necesitan Concretamente deber de e$istir un fic"ero -lista- con 'arios elementos Varios fic"eros con nombre !ue empiecen por (C2N Varios fic"eros -Y doc- de los cuales al%unos deberan contener la palabra -C)D@=)- Estudie el contenido del e&emplo !ue si%ue Editelo + e&ecutelo pasando 'arios ar%umentos (u ob&eti'o es "acerlo funcionar + entender como funciona
!ara ver distintos modos de maneRar listas vamos a &enerar todos los nombres posibles 'ormados por combinacion de las partes si&"ientesV Como parte @ los nombres de 'icheros de directorio act"al #"e empie(an por $<CA.$+ Como parte 8 los nombres contenidos en el 'ichero $lista$+ Como parte 3 los identi'icadores $cxxB cxx8 bxxE$ Como parte C la lista de parametros $@ $8 $3 ++ etc* Como parte E los 'icheros $4+doc$ #"e contienen la palabra $COH-XO$+ 'or i in =ls <CA.4= do 'or R in =cat lista= do 'or > in cxxB cxx8 bxxE do 'or l in $4 do 'or m in =&rep 0l OCOH-XOO 4+doc= do echo $i+$R+$>+$l+$m done done done done done

Cuando ten%amos bucles unos dentro de otros decimos !ue son bucles anidados El ni'el de anidamiento de un bucle es el nmero de bucles !ue "a+ unos dentro de otros Kbrea&K 4 Kcon!in#eK E$iste una forma de controlar un blucle desde el interior del mismo Para eso podemos usar -break-. o -continue- (e pueden usar en cual!uiera de los bucles !ue acabamos de 'er (>"ile. until. + for) ,a palabra reser'ada -break- pro'oca la salida de un bucle por el final (i 'iene se%uido de un numero -n- saldr de -n- ni'eles No poner nmero e!ui'ale a poner el nmero 3 ,a palabra reser'ada -continue- pro'oca un salto al comien#o del bucle para continuar con la si%uiente iteracin (i 'iene se%uida de un numero -n- saldr de -n- ni'eles

pr"_brea>_contin"e He'inir la variable R como "na variable de tipo entero e iniciali(arla a cero+ T"e&o la incrementamos a cada iteraci)n del b"cle y si R es menor #"e die( mostramos el doble de s" valor+ y en caso contrario salimos del b"cle typeset 0i R=B while tr"e do let R=R2@ i' 5 $R 0et 3 6 then contin"e 'i i' 5 $R 0et C 6 then contin"e 'i i' 5 $R 0lt @B 6 then expr $R Q4 8 else brea> 'i done

Probamos a"ora a e&ecutarlo + obtendremos


$ +Mpr"_brea>_contin"e 8 C @B @8 @C @; @:

2"ora edite + pruebe el si%uiente e&emplo !ue llamaremos -pruJbreakJcontinue4+Mpr"_brea>_contin"e8 'or i in "no dos tres do 'or R in a b c do 'or > in @ 8 3 C E do echo $i $R $> i' 5 O$RO = ObO 6 then brea> 'i i' 5 O$>O = O8O 6 then contin"e 8 'i done done done

El resultado de la e&ecucin sera como si%ue

$ +Mpr"_brea>_contin"e8 "no a @ "no a 8 "no b @ "no c @ "no c 8 dos a @ dos a 8 dos b @ dos c @ dos c 8 tres a @ tres a 8 tres b @ tres c @ tres c 8

Arre/los Vamos a estudiar a"ora un tipo de 'ariables !ue se caracteri#an por!ue permiten %uardar 'alores asociados a una posicin ,os llamamos -arre%los- (en in%les arra+) tambi5n se pueden llamar tablas En el si%uiente e&emplo usaremos una 'arirable -tab_`- !ue se comporta como si estu'iera formada por 'arias 'ariables tab_3`. tab_4`. tab_L`. etc Vamos a ilustrarlo con un e&emplo !ue tiene un poco de todo (e trata de un pro%rama !ue debe estudiar detenidamente

Hesarrollar "na '"nci)n #"e admita "n parametro de entrada+ <i el parametro de entrada contiene "na cadena #"e ya esta almacenada en la tabla $tabnom$ retornar sin mas* pero si no esta aWadir esa palabra a la tabla+ X"arda.ombre?Ac <i n"mero de parametros distindo de @ salir con error+ i' 5 $ 0ne @ 6 then echo O."mero de parametros invalido en X"arda.ombre?AO ret"rn 8 'i typeset 0i R=@ 'or var in $ctab546d do i' 5 $var = $@ 6 then ind=$R ret"rn @ 'i let R=R2@ done ind=$R tab5$ind6=$@ ret"rn B d main while tr"e do echo 0e O-ntrod"(ca al&o o p"se %-.IRO/ directamente para 'inali(ar V QcO read HAIO i' 5 b O$HAIOO 6 then brea> 'i X"arda.ombre $HAIO done echo OAhora vis"ali(amos los datos introd"cidosO 'or l in $ctab546d do echo $l done echo 8 $ctab586d echo @ $ctab5@6d

El resultado de e&ecutar esto introduciendo una serie de datos sera como si%ue1
-ntrod"(ca al&o o p"se -ntrod"(ca al&o o p"se -ntrod"(ca al&o o p"se -ntrod"(ca al&o o p"se -ntrod"(ca al&o o p"se -ntrod"(ca al&o o p"se -ntrod"(ca al&o o p"se Ahora vis"ali(amos los hhhhh RRRR ooooooooo >> 8 RRRR @ hhhhh %-.IRO/ directamente %-.IRO/ directamente %-.IRO/ directamente %-.IRO/ directamente %-.IRO/ directamente %-.IRO/ directamente %-.IRO/ directamente datos introd"cidos para para para para para para para 'inali(ar 'inali(ar 'inali(ar 'inali(ar 'inali(ar 'inali(ar 'inali(ar V V V V V V V hhhhh RRRR RRRR RRRR ooooooooo >>

Con esto comprobamos !ue podemos acceder no solo a la lista completa de los datos introducidos sino a uno solo de ellos proporcionando un nmero con la posicin donde el dato "a sido almacenado Tambi5n comprobamos !ue el 'alor -&&&&- se "a indroducido 'arias 'eces pero nuestro pro%rama solo lo %uarda una 'e# %racias a !ue antes de %uardar cada 'alor se comprueba si dic"o 'alor +a fe %uardado antes

Un e2empo sencillo: Cons!r#ccin e #n men#


m"estraopcionesmen"prin?A c clear echo $@A ,echa y hora$ echo $8A Calendario del m1s act"al$ echo $3A Calendario del aWo act"al$ echo $CA Calc"ladora de precisi)n arbitraria$ echo $EA Tista de "s"arios conectados$ echo $;A Kemoria libre del sistema$ echo $3A Car&a del sistema$ echo $:A Oc"pacion de todo el sistema de 'icheros$ echo $BA Ierminar$ echo echo 0e O-ntrod"(ca la opci)n deseada V QcO d pa"sa ?A c echo echo 0e O!"lse read d

para contin"arO

KA-. while tr"e do m"estraopcionesmen"prin read O!I clear case $O!I in 373A echo O!ara salir deberF p"lsar $#$O P pa"sa PP CA echo O!ara salir deberF introd"cir $#"it$O P pa"sa PP esac echo P echo case $O!I in BA exit PP @A date P pa"sa PP 8A cal P pa"sa PP 3A cal =date 2^J= 7 less PP CA bc PP EA who 0iIH P pa"sa PP ;A cat MprocMmemin'o P pa"sa PP !odrNa "sarse el comando 'ree 3A top 0s PP :A d' P pa"sa PP 4A echo 0e OOpcion erronea+QaO P pa"sa PP esac done echo echo

Vamos a comentar al%unos aspectos de este pro%rama Comien#a con ->"ile true- (2ntes de esto lo !ue "a+ es la declaracin de un par de funciones) *n pro%rama as se e&ecutara en un bucle sin fin pero e$iste una instruccin -e$it- en medio del pro%rama para finali#ar cuando se eli&a la opcin adecuada Primero se llama a una funcin -muestraopciones- !ue nos muestra las opciones disponibles + nos in'ita a introducir una de ellas !ue %racias a la instruccin read ser almacenada en la 'ariable )PT El contenido de esta 'ariable se usa en un par de sentencias -case- ,a primera solo considera si es al%una de las opciones -L.a. o A- + en funcin de ello muestra un mensa&e adicional El se%undo -casesir'e para desencadenar la funcionalidad ele%ida E$iste un -Y)- !ue sir'e para ad'ertir !ue la opcin introducida no es correcta 9ui#s +a "a notado !ue en ocasiones usamos la opcin Ge con ec"o

Esto se "ace cuando usamos un caracter especial !ue debe ser interpretado como en el caso de -:a(emite un pitido). o como -:c- (e'ita el salto de carro) El comando -clear- se usa para limpiar la pantalla El cos!e e los coman os e,!ernos Estamos acostumbrados a usar comandos e$ternos como forama de apo+o a la pro%ramacin en s"ellGscript Esto es mu+ normal + el () tiene una %ran cantidad de comandos !ue estan dise6ados para poderlos combinar unos con otros mediante entrada salida 2 pesar de esto el uso de comandos e$ternos tiene un coste mu+ ele'ado en comparacin con el de los comandos internos. implementados en la propia s"ell Por esto con'iene siempre !ue sea posible usar estos ltimos En caso contrario tampoco se notar muc"a diferencia cuando los usemos en medio de un proceso interacti'o En estos la lentitud de respuesta del usuario no permite apreciar la 'enta&as de una pro%ramacin efeciente Donde si se apreciar esta diferencia es cuando usemos comandos dentro de bucles Para ilustrar lo !ue decimos usaremos un pro%ramita de e&emplo !ue simplemente utilice un contador de bucle incrementado una 'ariable
S"cle con let ?comando internoA typeset 0i .=B time while 5 $. 0le 8BBBB 6 do let .2=@ done real "ser sys Bm@+C@3s Bm@+B3Bs BmB+B3Bs

S"cle con expr ?comando externoA typeset 0i .=B time while 5 $. 0le @BB 6 do .==expr $. 2 @= done real "ser sys Bm@+3@@s BmB+83Bs BmB+B;Bs

2mbas pruebas tardan apro$imadamente lo mismo pero el primer bucle e&ecuta 4DDDD iteraciones + el se%undo solo 3DD Es decir !ue el uso del comando e$terno "ace el comando unas 4DD 'eces ms lento 9ui#s piense !ue es culpa de e$pr + en parte es cierto pero lo realmente importante es !ue "a+ !ue arrancar una subs"ell la cual arrancar e$pr para lue%o tomar la salida estandar + e$pandirlo todo correctamente Esto comporta abrir los respecti'os fic"eros de esos e&ecutables + abrir un fic"ero es al%o !ue re!uiere un traba&o !ue no tiene lu%ar cuando e&ecutamos comandos internos de la s"ell 1ecomen aciones 5inales 2cabamos de e$plicar un pro%rama mu+ sencillo Compli!uelo un poco a6adiendo una opcin F !ue muestre un submen !ue entre otras cosas conten%a una opcin !ue 'uel'a al men principal *se su ima%inacin + parcti!ue para intentar me&orarlo En estos momentos +a dispone de toda la base de conocimientos !ue le permitir personali#ar su entorno de traba&o o construir sencillos scripts !ue le a+uden a reali#ar una %ran 'ariedad de tareas. o tambi5n puede in'esti%ar al%unos de los pro%ramas del sistema escritos en s"ellGscript (i se conforma con lo estudiado + no intenta ponerlo en prctica pronto lo ol'idar todo Practi!ue la pro%ramacin en s"ellGscript +a mismo antes de !ue ol'ide la te"ora Empiece por las cosas !ue "emos e$plicado pero no se !uede en eso @ntente lle%ar un poco ms le&os En las lecciones !ue si%uen continuaremos tratando temas !ue abrirn nue'as puertas a su

conocimiento En nin%n caso podemos detenernos e$cesi'amente en nin%una de ellas 2 la pro%ramacin en s"ellGscript la "emos dedicado 'arias lecciones + anteriormente dedicamos al%unos ms a la s"ell como interprete de comandos. pero "a lle%ado el momento de decir !ue debe de poner muc"o de su parte + !ue e$iste el -man bas"- para buscar las cosas !ue no pudimos e$plicar a!u No 'amos a incluir nin%n test a"ora en lu%ar de ello + a ries%o de resultar pesados 'amos a insistir Practi!ue a"ora por su cuenta

Nociones e pro/ramacin en a<&


9ue es a>k + para !ue se usa Norma de uso Estructura de un pro%rama a>k E$presiones re%ulares Delimitadores de campos (eleccin de re%istros por campo Normato de salida con printf *so de 'ariables operadores + e$presiones Computo con re%istros (entencias condicionales + bucles Pasar 'alores al script a>k Declaracin de funciones Nuncin s+stem ,a funcin %etline + otras funciones a'an#adas 2rra+s

3#e es a<& 4 para 8#e se #sa ,a palabra -a>k- se usa tanto para referirse a un len%ua&e de manipulacin de fic"eros de datos como para referirse a su interprete Dado !ue los () tipo *ni$ incluido ,inu$ acostumbran con muc"a frecuencia a usar fic"eros de confi%uracin del sistema en formatos de de te$to perfectamente le%ibles + editables se dise6o un len%ua&e para poder procesar este tipo de fic"eros de datos en formato de te$to Cuando un pro%rama necesita una 'elocidad mu+ alta para acceder a unos datos o para modificarlos se utili#an estructuras de datos ms sofisticadas En muc"os otros casos un fic"ero de confi%uracin ser accedido de forma mu+ ocasional. + resulta ms interesante usar un formato de te$to sencillo Por e&emplo "a+ fic"eros de confi%uracin !ue solo se usan durante la car%a de un pro%rama 2l%unos de estos pro%ramas suelen car%arse una sola 'e# mientras arranca el sistema + lue%o en condiciones normales permanecen arrancados todo el tiempo -a>k- naci en 3FaE como un len%ua&e pe!ue6o + sencillo pero desde entonces "a e'olucionado muc"o + en la actualidad se puede afirmar !ue es un len%ua&e mu+ potente + 'erstil @mposible tratarlo en profundidad en un curso como este -a>k- es un complemento mu+ bueno para su uso con s"ellGscript Esta leccin no 'a a condicionar la asimilacin de lecciones posteriores pero recomendamos !ue como mnimo le de un bre'e repaso +a !ue -a>k- puede resultar e$tremadamente til en determinadas circunstancias Nos 'amos a conformar con e$plicar unas pocas cosas por!ue con ello conse%uiremos dos ob&eti'os El primero !ue pueda usarlo para un limitado tipo de tareas bastante frecuentes. + el se%undo !ue cono#ca su e$istencia + para !ue se usa De esta forma puede ampliar conocimientos

por su cuenta cuando lo necesite Nos 'amos a centrar en el procesamiento de datos en los cuales cada lnea estar estructurada en campos Estos campos estarn delimitados entre si por al%n carcter o por al%una secuencia especial de caracteres especialmente reser'ado para ello Esta secuencia ser el delimitador de campos + no debe aparecer en el interior de nin%n campo Cada lnea e!ui'ale a un re%istro ,a ma+ora de las bases de datos. + "o&as de clculo permiten 'olcar los datos en formato de te$to para poder ser e$portados entre distintas bases de datos Estas salidas se pueden procesar fcilmente mediante -a>k- Tambi5n se puede usar -a>k- con la salida de di'ersos pro%ramas Esto permite entre otras cosas usar -a>k- para acoplar una salida de un pro%rama con la entrada de otro !ue necesite un formato mu+ distinto En definiti'a 'amos a e$plicar solo una pe!ue6a parte de este potente len%ua&e pero comprobar su %ran utilidad mu+ pronto 9orma e #so -a>k- suele estar instalado en la ma+ora de los sistemas +a !ue su uso suele ser necesario Por eso en ,inu$ suele encontrarse entre los pa!uetes bsicos del sistema en todas las distribuciones (e puede usar de 'arias formas Tenemos !ue pasar a -a>k- el te$to del pro%rama. + los datos El primero se puede pasar bien como ar%umento o indicando Gf nombre del fic"ero !ue contiene el te$to del pro%rama ,a entrada se puede pasar dando el nombre del fic"ero de entrada como ltimo ar%umento o en caso contrario lo tomar por la entrada estndar
$ Xeneramos en Mtmp "n par de 'icheros $ echo 0e OQnO / MtmpMecho+o"t $ echo $c print OHola m"ndoO d$ / MtmpMeRemplo@+aw> $ ERec"taremos el mismo pro&rama de C 'ormas distintas $ echo 0e OQnO 7 aw> $c print OHola m"ndoO d$ Hola m"ndo Hola m"ndo $ aw> $c print OHola m"ndoO d$ MtmpMecho+o"t Hola m"ndo Hola m"ndo $ echo 0e OQnO 7 aw> 0' MtmpMeRemplo@+aw> Hola m"ndo Hola m"ndo $ aw> 0' MtmpMeRemplo@+aw> MtmpMecho+o"t Hola m"ndo Hola m"ndo

El pro%rama !ue acabamos de utili#ar imprimir el literal ?/ola mundo? a cada lnea de datos !ue procese En este caso usamos solo un par de lneas 'acas como entrada de datos Vamos a locali#ar el binario de -a>k$ whereis aw> M"srMbinMaw>

Vamos a suponer !ue en su sistema se encuentre tambi5n en -8usr8bin- Puesto !ue a>k es un len%ua&e interpretado perfectamente le%ible tambi5n podemos decir !ue los pro%ramas de a>k son script Para poder usarlos directamente podemos a6adir una primera lnea con nmero m%ico + poner permiso de e&ecucin
$ $ $ $ echo $ bM"srMbinMaw> 0'$ / MtmpMeRemplo8+aw> echo $c print OHola m"ndoO d$ // MtmpMeRemplo8+aw> chmod 2x MtmpMeRemplo8+aw> echo 0e OQnO 7 MtmpMeRemplo8+aw> Hola m"ndo Hola m"ndo

Es!r#c!#ra e #n pro/rama a<& *n pro%rama -a>k- puede tener tres secciones distintas

Puede incluir una primera parte para !ue se e&ecute antes de procesar nin%una de las lneas de entrada (e usa para ello la palabra reser'ada BEGIN se%uida de una o mas instrucciones todas ellas en%lobadas dentro de un par de corc"etes -Z- . -[Puede incluir una parte central !ue se procesar entera para cada linea de entrada de datos + !ue puede tener 'arios blo!ues -Z- . -[- (i uno de estos blo!ues contiene una e$presin re%ular se procesar solo cuando la lnea de entrada se a&uste al patrn de la e$presin re%ular Puede incluir una parte final !ue se procesar en ltimo lu%ar una 'e# termine la lectura + procesado de todas las lneas de entrada (e usa para ello la palabra reser'ada EN" se%uida de una o ms instrucciones todas ellas en%lobadas dentro de un par de corc"etes -Z- . -[-

El primer e&emplo !ue 'imos anteriormente (?/ola mundo?) solo tena una de las tres partes Concretamente era la parte central +a !ue no pusimos nin%una de las palabras reser'adas BEGIN o EN" Vamos a poner a"ora un e&emplo con las tres partes Edite un fic"ero con nombre -8tmp8Lpartes a>kSEX-. c print OErase "na ve(+++O d c print O+++y entonces bla* bla* bla +++O d E.H c print O+++y colorNn colorado este c"ento se ha acabado+O d

E&ecutelo con1
$ echo 0e OQnQnQnO 7 aw> 0' MtmpM3partes+aw> fAma Erase "na ve(+++ +++y entonces bla* bla* bla +++ +++y entonces bla* bla* bla +++ +++y entonces bla* bla* bla +++ +++y entonces bla* bla* bla +++ +++y colorNn colorado este c"ento se ha acabado+

Es importante !ue comprenda !ue la parte central se e&ecutar tantas 'eces como lneas de datos e$istan En nuestro e&emplo son cuatro lneas %eneradas por -ec"o Ge ?:n:n:n? - En cambio las partes -<E=@N Z [- + -END Z [- se e&ecutan una sola 'e# ,a primera antes de procesar la primera lnea + la ltima despu5s de procesar la ltima lnea ,os comentarios en -a>k- comien#an con un -U- + terminan al final de la lnea E,presiones re/#lares 2l%unas 'eces los datos pueden 'enir con al%unas lineas !ue no interesa procesar o !ue se deben procesar de forma distinta Podemos usar una e$presin re%ular delimitada por el carcter -8- para seleccionar una accin especial Vamos a editar otro e&emplo !ue llamaremos -8tmp8e$pre% a>k-1
SEX-. c print OErase "na ve(+++O d MY$M c print OTinea vacNaO d M5B0D62M c print OIiene "n nGmeroO d MQ+$M c print OIermina con p"ntoO d Esto es "n comentario c print O00000000000000000000000000000000000000O d E.H c print O+++y colorNn colorado este c"ento se ha acabado+O d

2"ora editamos un se%undo fic"ero -8tmp8e$pre% dat-1


TNnea nGmero @+ TNnea nGmero 8 ++++ ,in de los datos

2"ora e&ecute lo si%uiente1

$ aw> 0' MtmpMexpre&+aw> MtmpMexpre&+dat Erase "na ve(+++ Iiene "n nGmero Iermina con p"nto 00000000000000000000000000000000000000 Iiene "n nGmero 00000000000000000000000000000000000000 Tinea vacNa 00000000000000000000000000000000000000 Iermina con p"nto 00000000000000000000000000000000000000 00000000000000000000000000000000000000 +++y colorNn colorado este c"ento se ha acabado+

Vemos !ue cada lnea de datos puede cumplir ms de una re%la + !ue cuando no ponemos una e$presin re%ular siempre se e&ecutar la accin En este caso todas las lneas pro'ocan la escritura de una lnea de %uiones -GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGEl uso de e$presiones re%ulares puede a+udarnos a eliminar cabeceras. lneas 'acas o incompletas o cosas as !ue no deseamos procesar "elimi!a ores e campos No "emos tratado aun los campos de una lnea *na lnea !ue ten%a distintos campos debe usar al%una secuencia para delimitar los campos entre si ,o mismo para definir un delimitador !ue en cual!uier otro caso donde se usen cadenas de caracteres podemos encontrarnos la necesidad de usar caracteres especiales !ue no pueden ser introducidos directamente Para ello e$isten determinadas secuencias !ue empie#an por el carcter -:+ !ue tienen si%nificado especial :a :b :f :n :r :t :' Carac!eres e escape Produce un pitido en el terminal ;etroceso (alto de p%ina (alto de lnea ;etorno de carro Tabulador "ori#ontal Tabulador 'ertical

:ddd Carcter representado en octal por -ddd:$"e$ Carcter representado en "e$adecimal por -"e$:c Carcter -cEl ltimo caso se usa para eliminar el si%nificado especial de un carcter en determinadas circunstancias Por e&emplo para usar un -R- o un -G- en una e$presin re%ular usaramos -:R- o -:GPodemos ele%ir un solo carcter para separar campos /a+ fic"eros de confi%uracin como 8 etc8pass>d. 8etc8%roup. !ue usan un solo carcter para delimitar los campos Por e&emplo los dos puntos -1- . el blanco -: -. la coma -.- el tabulador -:t- etc -a>k- permite usar como delimitador ms de un carcter Para ello se asi%nar a la 'ariable -N(- una cadena de caracteres !ue conten%a una e$presin re%ular Por e&emplo para usar como delimitador el carcter -1- "abra !ue incluir -<E=@N Z N( Q ?1? [(i no se especifica nin%n delimitador se asumir !ue los campos estarn delimitados por uno o ms blancos o tabuladores consecuti'os lo cual se e$presa como ?_: :t`R? ,as e$presiones re%ulares +a fueron estudiadas en un captulo especial El carcter -:- debe usarse para escapar cual!uier carcter con si%nificado especial en una e$presin re%ular + al%unos caracteres normales precedidos de -:- se

usan para representar caracteres especiales -:t- es el tabulador En -a>k- se usa 03 para referenciar el campo 3. 04 para referenciar el campo 4. etc + para referenciar el re%istro completo usaremos 0D Edite el si%uiente fic"ero -8tmp8delim3 a>kc print O2O* $@* O2O* $8* O2O* $3* O2O* $C* O2O d

03. 04. 0L. + 0A representan a los campos 3. 4. L. + A respecti'amente Edite el si%uiente fic"ero de datos -8tmp8delim3 dataaa bbb ccc @@@ 888 333 CCC ddd eee

En la primera lnea debe introducir un blanco para separar los primeros blancos + una secuenciencia de -. . . - para separar los dos ltimos campos Es importante !ue lo edite de esta forma por!ue el resultado de los e&emplos podra 'ariar 2"ora e&ecute lo si%uiente1
$ aw> 0' MtmpMdelim@+aw> MtmpMdelim@+dat 2 aaa 2 bbb 2 ccc 2 ddd 2 2 @@@ 2 888 2 333 2 CCC 2

Edite el si%uiente fic"ero -8tmp8delimD a>kc print O2O* $3* O2O* $C* O2O* $@* O2O* $8* O2O d

2"ora e&ecute lo si%uiente1


$ aw> 0' MtmpMdelimB+aw> MtmpMdelim@+dat 2 ccc 2 ddd 2 aaa 2 bbb 2 2 333 2 CCC 2 @@@ 2 888 2

Con ello "emos conse%uido 'ariar el orden de aparicin de los campos. pero toda'a no "emos especificado nin%n delimitador Por ello "emos asumido el delimitador por defecto (uno o ms blancos + tabuladores) Para especificar un delimitador distinto tenemos !ue asi%nar su 'alor a la 'ariable N( + adems tenemos !ue "acerlo antes de leer el primero re%istro por lo cual se incluir la instruccin en la seccin inicial precedida de <E=@N Edite el si%uiente fic"ero -8tmp8delim4 a>kSEX-. c ,< = OQ O d c print O2O* $@* O2O* $8* O2O* $3* O2O* $C* O2O d

Estamos definiendo un nico carcter blanco como separador 2"ora e&ecute lo si%uiente1
$ aw> 0' MtmpMdelim8+aw> MtmpMdelim@+dat 2 aaa 2 bbb 2 ccc 2 2 2 @@@ 2 888 2 333 2 CCC 2

Vamos a cambiar de delimitador Edite el si%uiente fic"ero -8tmp8delimL a>kSEX-. c ,< = OQtO d c print O2O* $@* O2O* $8* O2O* $3* O2O* $C* O2O d

Estamos definiendo un nico carcter tabulador como separador 2"ora e&ecute lo si%uiente1
$ aw> 0' MtmpMdelim3+aw> MtmpMdelim@+dat 2 aaa bbb ccc 2 2 ddd 2 2 2 @@@ 888 333 CCC 2 2 2 2

Seleccin e re/is!ros por campo Vamos a editar un fic"ero !ue simular la salida de datos obtenida desde una base de datos

relacional *saremos estos datos en 'arios e&emplos Puede corresponder a una contabilidad de un al!uiler de un piso ,o llamaremos -contabil dat'echa7concepto7importe 000000000020000000020000000 B@0B@0@DDD70 7 D; @;0@80@DDD7AXLA 7 0@C;EB BE0B@08BBB7TLU 7 0@E3D3 8C0B@08BBB7XA< 7 03C@3E 830B@08BBB7-.XRE<O 7 @C@8BB B@0B808BBB7KE.< 7 0D;BD8 8E0B808BBB7TLU 7 0@8C3E B@0B308BBB7KE.< 7 0D;BD8 B;0B308BBB7-.XRE<O 7 @B@3BB B@0BC08BBB7KE.< 7 0D;BD8 B;0BC08BBB7AXLA 7 0@E:ED B30BC08BBB7-.XRE<O 7 @3CBBB B@0BE08BBB7KE.< 7 0D:D3E B80BE08BBB7TLU 7 0@@CCD BD0BE08BBB7-.XRE<O 7 DEBBB 830BE08BBB7XA< 7 08@C8: 8E0BE08BBB7XA< 7 0@;CE8 B@0B;08BBB7KE.< 7 0D:D3E B30B;08BBB7-.XRE<O 7 @3BBBB B@0B308BBB7KE.< 7 0D:D3E BC0B308BBB7TLU 7 0@8CB3 B30B308BBB7AXLA 7 0EE;@ @B0B308BBB7-.XRE<O 7 DDBBB 8C0B308BBB7XA< 7 0@@DC: B@0B:08BBB7KE.< 7 0D:D3E @B0B:08BBB7-.XRE<O 7 @883EE BC0BD08BBB7TLU 7 0@8@;: @B0BD08BBB7-.XRE<O 7 @8DBBB @D0BD08BBB7AXLA 7 0@BE8D 8:0BD08BBB7XA< 7 08;8B B@0@B08BBB7KE.< 7 0D:D3E @B0@B08BBB7-.XRE<O 7 @@8BBB ?38 rowsA

,o primero !ue 'emos es !ue tiene una cabecera de dos lneas intiles + un final tambi5n intil Podemos ase%urar !ue las lneas !ue deseamos procesar cumplirn un patrn de dos nmeros %uin dos nmeros %uin cuatro nmeros + lnea 'ertical Vamos a editar un pro%rama !ue llamaremos -contabil3 a>kSEX-. c ,<=OQ7O d M5B0D65B0D6Q05B0D65B0D6Q05B0D65B0D65B0D65B0D6Q7M print .R* O* O* $@* O* O* $8* O* O* $3 d c

Vamos a e&ecutar este e&emplo + 'amos a 'er su salida

0 a>k Gf contabil3 a>k I contabil dat


3 * C * E * ; * 3 * : * D * @B * @@ * @8 * @3 * @C * @E * @; * @3 * @: * @D * 8B * 8@ * 88 * 83 * 8C * 8E * 8; * 83 * 8: * 8D * 3B * 3@ * 38 * 33 * 3C * B@0B@0@DDD * @;0@80@DDD * BE0B@08BBB * 8C0B@08BBB * 830B@08BBB * B@0B808BBB * 8E0B808BBB * B@0B308BBB * B;0B308BBB * B@0BC08BBB * B;0BC08BBB * B30BC08BBB * B@0BE08BBB * B80BE08BBB * BD0BE08BBB * 830BE08BBB * 8E0BE08BBB * B@0B;08BBB * B30B;08BBB * B@0B308BBB * BC0B308BBB * B30B308BBB * @B0B308BBB * 8C0B308BBB * B@0B:08BBB * @B0B:08BBB * BC0BD08BBB * @B0BD08BBB * @D0BD08BBB * 8:0BD08BBB * B@0@B08BBB * @B0@B08BBB * 0 AXLA TLU XA< -.XRE<O KE.< TLU KE.< -.XRE<O KE.< AXLA -.XRE<O KE.< TLU -.XRE<O XA< XA< KE.< -.XRE<O KE.< TLU AXLA -.XRE<O XA< KE.< -.XRE<O TLU -.XRE<O AXLA XA< KE.< -.XRE<O * * * * * * * D; 0@C;EB 0@E3D3 03C@3E @C@8BB 0D;BD8 0@8C3E 0D;BD8 @B@3BB 0D;BD8 0@E:ED @3CBBB 0D:D3E 0@@CCD DEBBB 08@C8: 0@;CE8 0D:D3E @3BBBB 0D:D3E 0@8CB3 0EE;@ DDBBB 0@@DC: 0D:D3E @883EE 0@8@;: @8DBBB 0@BE8D 08;8B 0D:D3E @@8BBB

* * * * * * * * * * * * * * * * * * * * * * * * *

Podemos apreciar 'arias cosas N; es una 'ariable del sistema !ue toma el 'alor del nmero de re%istro !ue se est procesando Podemos 'er !ue las dos primeras lneas + la ltima "an sido descartadas Tambi5n 'emos !ue las primeras lneas usan un solo d%ito para el nmero de re%istro + lue%o usan dos d%itos Esto !ue las columnas no !ueden alineadas Vamos a modificar el pro%rama para !ue muestre los re%istros completos (0D) cuando no se cumpla la condicin anterior Para ello editaremos un fic"ero !ue llamaremos -contabdescarte a>kSEX-. c ,<=OQ7O d b M5B0D65B0D6Q05B0D65B0D6Q05B0D65B0D65B0D65B0D6Q7M print .R* $B d c

Vamos a e&ecutar este e&emplo + 'amos a 'er su salida 0 a>k Gf contabdescarte a>k I contabil dat
@ 'echa7concepto7importe 8 000000000020000000020000000 3E ?38 rowsA

9orma!o e sali a con prin!5 Para imprimir con formato usaremos -printf- en lu%ar de -print- printf se usa en 'arios len%ua&es El primer ar%umento de esta funcin debe de ser una cadena de caracteres !ue conten%a el formato de salida deseado para la salida ,os formatos de cada dato se e$presan mediante unas directi'as !ue empie#an con el carcter -V- + debe de e$istir en dic"a cadena tantas directi'as como datos separados por coma a continuacin de la cadena de formato /a+ !ue tener en cuenta !ue en -a>k- la concatenacin de cadenas se usa poniendo una cadena a

continuacin de otra separada por blancos Por e&emplo1 U cad Q ?(unodos)? cad Q ?uno? ?dos? S cad Q ?(? cad ?)? Especi5icacin e 5orma!o e a!os para Kprin!5K Vc Carcter 2(C@@ Vd Ve VE Vf V% V= Vo Vs V$ V] Entero representado en decimal Coma flotante (e$ponente Q e_RG`dd) Coma flotante (e$ponente Q E_RG`dd) Coma flotante sin e$ponente E!ui'ale al ms corto de los formatos -e- o -fE!ui'ale al ms corto de los formatos -E- o -NEntero representado en octal Cadena de caracteres Entero representado en "e$adecimal con minsculas Entero representado en "e$adecimal con ma+sculas

VV Carcter -VEn estos formatos se puede intercalar inmediatamente a continuacin del -V- primero un si%no -R- o un -G- !ue son opcionales + si%nifican respecti'amente alineacin a la derec"a o a la i#!uierda En se%undo lu%ar + de forma i%ualmente opcional se puede intercalar un nmero para indicar un anc"o mnimo ((i el dato ocupa ms !ue el dato especificado se muestra el dato completo "aciendo caso omiso de la indicacin de anc"ura) En el caso de coma flotante se puede indicar el anc"o total del campo + la precisin (anc"ura) de la parte decimal Veamos unos pocos e&emplos
$ echo 7 aw> $c print OHola m"ndoO d$ print' OHola ^sQnO* Om"ndoO d$ print' O ^d ^s QnO* 33* Om"ndoO d$ print' O ^@Bd ^@Bs QnO* 33* Om"ndoO d$

Hola m"ndo $ echo 7 aw> $c Hola m"ndo $ echo 7 aw> $c 33 m"ndo $ echo 7 aw> $c $ echo 33 $ echo

33 m"ndo 7 aw> $c print' O ^0@Bd ^0@Bs QnO* 33* Om"ndoO d$ m"ndo 7 aw> $c print' O ^2Cd ^2Cs QnO* 33* Om"ndoO d$ print' O ^BCd ^2Cs QnO* 33* Om"ndoO d$ print' O ^B@B+E' ^E ^&QnO* 8@+C3E83D83* 8@+C3E83D83* 8@+C3E83D83 d$ d$

233 m"ndo $ echo 7 aw> $c BB33 m"ndo $ echo 7 aw> $c

BB8@+C3E8: 8+@C3E8:E2B@ 8@+C3E3 $ echo 7 aw> $c print' O ^@B+E' ^E ^&QnO* 8@CBBBB* 8@CBBBB* 8@CBBBB 8@CBBBB+BBBBB 8+@CBBBBE2B; 8+@Ce2B;

Practi!ue un poco in'esti%ando con ms detalle el funcionamiento de estos formatos

Uso e 0ariables opera ores 4 e,presiones En -a>k- podemos usar toda clase de e$presiones presentes en cual!uier len%ua&e Cual!uier identificador !ue no corresponda con una palabra reser'ada se asumir !ue es una 'ariable Para asi%nar un 'alor se usa el operador -QVamos a editar un fic"ero !ue llamaremos -e&emple$pr a>k- con al%unas e$presiones aritm5ticas
c contador = BP !one a cero la variable contador contador 22P -ncrementa en @ la variable contador contador 2=@BP -ncrementa en @B la variable contador+ contador 4=8 K"ltiplica por 8 la variable contador print contador contador = ? @B 2 8B A M 8 P print contador contador = s#rt ? 8E A P Rai( c"adrada de 8E print contador d

,o e&ecutamos + obser'amos el resultado


$ echo 7 aw> 0' eRemplexpr+aw> 88 @E E

No podemos e$plicar en detalle todo el len%ua&e -a>k- (e trata de !ue comprenda su utilidad + de !ue sea capa# de utili#arlo para determinadas tareas en las cuales resulta e$tremadamente til 2l%unas e$presiones parecen inspiradas en el len%ua&e C )tras parece !ue "an ser'ido de inspiracin para el len%ua&e Perl En realidad muc"os len%ua&es usan e$presiones parecidas Por ello 'amos a resumir en forma de tabla una serie de elementos !ue inter'ienen en las e$presiones !ue -a>k- es capa# de mane&ar Pero no 'amos a e$plicar en detalle cada cosa En lu%ar de eso daremos una descripcin resumida + procuraremos !ue los e&emplos posteriores ten%an un poco de todo Opera ores ari!m;!icos R G Y 8 V b 'ar Q e$pr 'ar RR 'ar GG 'ar RQ e$prJaritm 'ar GQ e$prJaritm 'ar YQ e$prJaritm 'ar 8Q e$prJaritm 'ar VQ e$prJaritm (uma ;esta 7ultiplicacin Di'isin 7dulo (resto) Potenciacin Opera ores e asi/nacin: 2si%nacin @ncrementa la 'ariable en una unidad Decrementa la 'ariable en una unidad @ncrementa la 'ariable en cierta cantidad Decrementa la 'ariable en cierta cantidad 7ultiplica la 'ariable por cierta cantidad Di'ide la 'ariable por cierta cantidad =uarda en la 'ariable el resto de su di'isin por cierta cantidad

'ar bQ e$prJaritm e$prJaritm QQ e$prJaritm e$prJaritm fQ e$prJaritm e$prJaritm I e$prJaritm e$prJaritm K e$prJaritm e$prJaritm IQ e$prJaritm e$prJaritm KQ e$prJaritm e$prJcad \ e$prJre%ular e$prJcad f\ e$prJre%ular e$prJlo%ica HH e$prJlo%ica e$prJlo%ica TT e$prJlo%ica f e$prJlo%ica atan4( +. $) cos($) e$p($) int($) lo%($) rand() sin($) s!rt($) srand($)

Ele'a el 'alor de la 'ariable en cierta cantidad Opera ores l/icos 4 e relacin: Comparacin de i%ualdad Comparacin de desi%ualdad Comparacin menor !ue Comparacin ma+or !ue Comparacin menor i%ual !ue Comparacin ma+or i%ual !ue (e a&usta al patrn No se a&usta al patrn )perador l%ico 2ND (X) )perador l%ico ); ()) )perador l%ico N)T (N)) 9#nciones ari!m;!icas: ;etorna el arcoGtan%ente de +8$ en radianes ;etorna el coseno de $ en radianes ;etorna el e$ponencial de $ (eb$) ;etorna el 'alor entero de $ truncado la parte decimal ;etorna el lo%aritmo neperiano de $ ;etorna un 'alor seudo aleatorio comprendido entre D + 3 ;etorna el seno de $ en radianes ;etorna la rai# cuadrada de $ @niciali#a la semilla para %enerar nmeros pseudoaleatorios 9#nciones para #sar con ca enas e carac!eres (ustitu+e -s- %lobalmente en todo -t- cada 'e# !ue se encuentre un patrn a&ustado a la e$presin re%ular -r- (i no se proporciona -tse toma 0D por defecto De'uel'e el nmero de sustituciones reali#ado ;etorna la posicin de la -subcadena- en -cadena- (Primera posicin Q 3) De'uel'e la lon%itud de la -cadena- Tomar 0D por defecto si no se proporciona -cadenaParte -cadena- en elementos de -arra+- utili#ando -sep- como separador (i no se proporciona -sep- se usar N( De'uel'e el nmero de elementos del arra+ (ustitu+e -s- en -t- la primera 'e# !ue se encuentre un patrn a&ustado a la e$presin re%ular -r- (i no se proporciona -t- se toma 0D por defecto De'uel'e 3 si tiene 5$ito + D si falla

%sub(r. s. t)

inde$(cadena. subcadena) len%t"(cadena)

split(cadena. arra+. sep)

sub(r. s. t)

substr(cadena. be%. len)

De'uel'e una subcadena de -cadena- !ue empie#a en -be%- con una lon%itud -len- (i no se proporciona lon%itud de'uel'e "asta el final de la cadena desde -be%Pasa a minsculas Pasa a ma+sculas Al/#nas o!ras 5#nciones @ndica si -cadena- se a&usta o no a la e$presin re%ular -e$prJre%Para obtener salida con formato

tolo>er(cadena) toupper(cadena) matc"(cadena. e$prJre%) s+stem(comando) sprintf(formato _. e$prG list` ) Comp#!o con re/is!ros

Vamos a modificar el pro%rama -contabil3 a>k- para procesar solo los re%istros de consumo de lu#. 'amos a me&orar el formato de salida. 'amos a incluir un contador de re%istros seleccionados. un contador de consumo de lu#. + al final obtendremos el consumo total + el consumo promedio de lu# ,o llamaremos -contabil4 a>kSEX-. c ,<=OQ7O P cont_re&_l"(=BP cont_importe_l"(=BP d $8 e MTLUM c cont_re&_l"( = cont_re&_l"( 2 @ P cont_importe_l"( = cont_importe_l"( 2 $3 P print' ?O^3d* ^3d* ^s* ^s* ^s* ^@BdQnO* .R* cont_re&_l"(* $@* $8* $3* cont_importe_l"(AP d E.H c print' ?OCons"mo promedio = ^dQnO* cont_importe_l"( M cont_re&_l"(A P d

Vamos a e&ecutar este e&emplo + 'amos a 'er su salida 0 a>k Gf contabil4 a>k I contabil dat
E* @* BE0B@08BBB* TLU D* 8* 8E0B808BBB* TLU @;* 3* B80BE08BBB* TLU 83* C* BC0B308BBB* TLU 8D* E* BC0BD08BBB* TLU Cons"mo promedio = 0@8:E: * * * * * 0@E3D3* 0@8C3E* 0@@CCD* 0@8CB3* 0@8@;:* 0@E3D3 08:838 03D38@ 0E8@8C 0;C8D8

,os datos !ue estamos usando para el e&emplo estn ordenados por fec"as Vamos a obtener un informe con un campo ms !ue ser el saldo de la cuenta Para ello editamos un fic"ero !ue llamaremos -contabilL a>kSEX-. c ,<=OQ7O P cont_importe=BP d M5B0D65B0D6Q05B0D65B0D6Q05B0D65B0D65B0D65B0D6Q7M c cont_importe = cont_importe 2 $3 P print' ?O^3d* ^s* ^s* ^s* ^@BdQnO* .R* $@* $8* $3* cont_importeAP d

Vamos a e&ecutar este e&emplo + 'amos a 'er su salida 0 a>k Gf contabilL a>k I contabil dat
3* C* E* ;* 3* :* D* @B* @@* @8* @3* @C* @E* @;* @3* @:* @D* 8B* 8@* 88* 83* 8C* 8E* 8;* 83* 8:* 8D* 3B* 3@* 38* 33* 3C* B@0B@0@DDD* @;0@80@DDD* BE0B@08BBB* 8C0B@08BBB* 830B@08BBB* B@0B808BBB* 8E0B808BBB* B@0B308BBB* B;0B308BBB* B@0BC08BBB* B;0BC08BBB* B30BC08BBB* B@0BE08BBB* B80BE08BBB* BD0BE08BBB* 830BE08BBB* 8E0BE08BBB* B@0B;08BBB* B30B;08BBB* B@0B308BBB* BC0B308BBB* B30B308BBB* @B0B308BBB* 8C0B308BBB* B@0B:08BBB* @B0B:08BBB* BC0BD08BBB* @B0BD08BBB* @D0BD08BBB* 8:0BD08BBB* B@0@B08BBB* @B0@B08BBB* 0 AXLA TLU XA< -.XRE<O KE.< TLU KE.< -.XRE<O KE.< AXLA -.XRE<O KE.< TLU -.XRE<O XA< XA< KE.< -.XRE<O KE.< TLU AXLA -.XRE<O XA< KE.< -.XRE<O TLU -.XRE<O AXLA XA< KE.< -.XRE<O * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * D;* 0@C;EB* 0@E3D3* 03C@3E* @C@8BB* 0D;BD8* 0@8C3E* 0D;BD8* @B@3BB* 0D;BD8* 0@E:ED* @3CBBB* 0D:D3E* 0@@CCD* DEBBB* 08@C8:* 0@;CE8* 0D:D3E* @3BBBB* 0D:D3E* 0@8CB3* 0EE;@* DDBBB* 0@@DC:* 0D:D3E* @883EE* 0@8@;:* @8DBBB* 0@BE8D* 08;8B* 0D:D3E* @@8BBB* D; 0@CEEC 03B3E@ 0;CE8; 3;;3C 0@DC@: 03@:D3 0@83D:E 08;;:E 0@88333 0@3:;3; 0C;3; 0@B3;@@ 0@@EB;B 08BB;B 0C@C:: 0E3DCB 0@E;D@E 08;D@E 0@8E:DB 0@3:8D3 0@C3:EC 0CC:EC 0E;:B8 0@EE333 033C88 0CEEDB :3C@B 38::@ 3B8;@ 08:3@C :38:;

Sen!encias con icionales 4 b#cles -a>k- es un len%ua&e mu+ completo + no poda faltar las sentencias de e&ecucin condicional + de e&ecucin en bucle 2l%unos de los conceptos !ue 'amos a comentar +a los "emos 'isto cuando "ablamos de la pro%ramacin en bas" + no 'amos a e$plicar con demasiado detalle cada tipo de sentencia ,a sinta$is !ue usa a>k no se parece a la sinta$is !ue +a "emos 'isto para bas" (e parece ms a la sinta$is del len%ua&e C De todas formas los conceptos +a nos resultan familiares + usaremos al%unos e&emplos para ilustrarlos Empe#aremos describiendo la sinta$is de cada tipo de sentencia Denominaremos accin a una sentencia simple o a una sentencia compuesta de la forma -Z sentencia3 S sentencia4 S [<entencia condicional $i'$ if ( expresin_lgica ) accion1 [ else accion ] <entencia condicional con los operadores $[$ y $V$ expresion_lgica ? accion1 : accion S"cle $while$

while ( expresin_lgica ) accion S"cle $do$ $while$ do

accion while ( expresin_lgica ) S"cle $'or$ for ( iniciali!ar_contador ; comprobar_contador ; modificar_contador ) accion

Dentro de los bucles podemos usar brea& para for#ar la salida de un bucle o con!in#e para saltar a la si%uiente iteracin Veremos de momento tan solo un e&emplo para la sentencia condicional -ifEdite el si%uiente fic"ero !ue llamaremos -contabilA a>kSEX-. c ,<=OQ7O P d M5B0D65B0D6Q05B0D65B0D6Q05B0D65B0D65B0D65B0D6Q7M c i' ? $3 /= BA c print' ?O^3d* ^s* ^s* ^sQnO* .R* $@* $8* $3AP d d

Vamos a e&ecutar este e&emplo + 'amos a 'er su salida 0 a>k Gf contabilA a>k I contabil dat
3* 3* @@* @C* @3* 8@* 8E* 8:* 3B* 3C* B@0B@0@DDD* 830B@08BBB* B;0B308BBB* B30BC08BBB* BD0BE08BBB* B30B;08BBB* @B0B308BBB* @B0B:08BBB* @B0BD08BBB* @B0@B08BBB* 0 -.XRE<O -.XRE<O -.XRE<O -.XRE<O -.XRE<O -.XRE<O -.XRE<O -.XRE<O -.XRE<O * * * * * * * * * * D; @C@8BB @B@3BB @3CBBB DEBBB @3BBBB DDBBB @883EE @8DBBB @@8BBB

Pasar 0alores al scrip! a<& En ocasiones puede resultar interesante poder pasar al%n 'alor al script a>k Vamos a modificar el pro%rama anterior para !ue muestre los re%istros con un importe superior a un 'alor !ue pasaremos por parmetro Edite el si%uiente fic"ero !ue llamaremos -contabilB a>kSEX-. c ,<=OQ7O P d M5B0D65B0D6Q05B0D65B0D6Q05B0D65B0D65B0D65B0D6Q7M c i' ? $3 /= minimo `` $3 %= maximo A c print' ?O^3d* ^s* ^s* ^sQnO* .R* $@* $8* $3AP d d

Vamos a e&ecutar este e&emplo pasando + 'amos a 'er su salida 0 a>k Gf contabilB a>k minimoQ3DDDDD ma$imoQ34DDDD I contabil dat
@@* B;0B308BBB* -.XRE<O * 3C* @B0@B08BBB* -.XRE<O * @B@3BB @@8BBB

/a+ !ue ad'ertir !ue el paso de parmetros e!ui'ale a definir una 'ariable + a asi%nar un 'alor pero esto 'alor no ser accesible "asta despu5s de leer el primer re%istro (i el 'alor pasado como parmetro tu'iera !ue ser accesible en la seccin <E=@N "abra !ue usar la opcin G' pre'io al paso del parmetro ;epetiremos el e&emplo pasando el delimitador del re%istro !ue usaremos en la seccin <E=@N Edite el si%uiente fic"ero !ue llamaremos -contabilC a>kSEX-. c ,< = delimitador P d M5B0D65B0D6Q05B0D65B0D6Q05B0D65B0D65B0D65B0D6Q7M c i' ? $3 /= minimo `` $3 %= maximo A c print' ?O^3d* ^s* ^s* ^sQnO* .R* $@* $8* $3AP d d

Vamos a e&ecutar este e&emplo pasando 'alores + 'amos a 'er su salida


$ aw> 0' contabil;+aw> minimo=@BBBBB maximo=@8BBBB deliminador=$7$ % contabil+dat

Vemos !ue no "emos obtenido el resultado esperado Vamos a 'ol'er a e&ecutar este e&emplo pasando el 'alor del delimitador con la opcin G' + 'amos a 'er su nue'a salida 0 a>k G' delimitadorQ-H- Gf contabilC a>k minimoQ3DDDDD ma$imoQ34DDDD I contabil dat
@@* B;0B308BBB* -.XRE<O * 3C* @B0@B08BBB* -.XRE<O * @B@3BB @@8BBB

"eclaracin e 5#nciones Como es l%ico -a>k- permite la declaracin de funciones Normalmente se recurre a implementar una funcin cuando necesitamos una funcionalidad !ue el len%ua&e no proporciona de forma predefinida o cuando !ueremos estructurar el cdi%o de un pro%rama %rande en fra%mentos ms pe!ue6os + por tanto ms mane&ables ,a sinta$is es mu+ sencilla
function nombre_de_la_funcin ( lista_de_par"metros ) { sentencias }

Por e&emplo para declarar una funcin !ue retorne un nmero aleatorio entre 3 + C Edite un fic"ero con nombre -dado a>k-

'"nction aleatorio ? minimo* maximo Ac ret"rn ? ? ? maximo 0 minimo 2 @ A 4 rand ?A A 2 minimo A P d E.Hc 'or ?i=BP i%8BP i22Ac print' ?O^3dA Entre @ y ; = ^3d Entre E y @E =^3dQnO* i* aleatorio ?@* ;A* aleatorio?E* @EAAP d

2"ora lo e&ecutamos 0 ec"o H a>k Gf dado a>k


BA @A 8A 3A CA EA ;A 3A :A DA @BA @@A @8A @3A @CA @EA @;A @3A @:A @DA Entre Entre Entre Entre Entre Entre Entre Entre Entre Entre Entre Entre Entre Entre Entre Entre Entre Entre Entre Entre @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ y y y y y y y y y y y y y y y y y y y y ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; = = = = = = = = = = = = = = = = = = = = E ; ; E 3 3 C ; E 3 ; E ; C E 8 @ 3 8 8 Entre Entre Entre Entre Entre Entre Entre Entre Entre Entre Entre Entre Entre Entre Entre Entre Entre Entre Entre Entre E E E E E E E E E E E E E E E E E E E E y y y y y y y y y y y y y y y y y y y y @E @E @E @E @E @E @E @E @E @E @E @E @E @E @E @E @E @E @E @E = = = = = = = = = = = = = = = = = = = = @8 3 3 @3 : ; 3 3 ; @B @C @B @@ @8 @E D D @C @C 3

9#ncin s4s!em Esta es una funcin fcil de usar !ue nos permite e&ecutar un comando del sistema operati'o En caso de 5$ito retorna D. + en caso de error retornar un 'alor distinto de cero
$ aw> $ SEX-. c i' ?system?OlsOA b=BA print' ?OError de eRec"ci)nQnOAP d$

Por e&emplo si !uisi5ramos 'erificar la e$istencia de un fic"ero almacenado en la 'ariable -nombreJfic"- tendramos !ue "acer
i' ?system?Otest 0r O nombre_'ichAA c 'print' ?O^s no encontradoQnO* nombre_'ichAP d

La 5#ncin /e!line 4 o!ras 5#nciones a0an>a as Este es es un apartado en el !ue ms !ue e$plicar cosas nos 'amos a limitar a mencionar ciertas posibilidades No podemos dedicar demasiado espacio a este tipo de cuestiones a'an#adas pero si con lo !ue en este apartado contemos conse%uimos ponerle los dientes lar%os nos daremos por satisfec"os aun!ue no entienda una palabra En primer lu%ar "a+ !ue ad'ertir !ue -%etline- !ue al i%ual !ue otras funciones de'uel'e un 'alor pero su sinta$is no es una tpica sinta$is de funcin No se usa como -%etline()- sino como una sentencia Esta funcin retorna 3 si lee una lnea. D si alcan#a el fin de la entrada de datos + G3 si se produce un error *sada simplemente como -%etline- sin nada ms lee la si%uiente linea de la entrada asi%nando 0D + des%losando los campos en 03. 04. 0L. etc

(e puede asi%nar el 'alor completo de la lnea leda a una 'ariable con -%etline 'ariable- e'itando de esta forma alterar el 'alor de 0D (e puede leer de un fic"ero usando el operador redireccin -%etline I ?fic"ero?- (e puede simboli#ar la entrada estndar como ?G? (e puede leer desde un pipe -?>"oami? H %etline usuarioEdite un fic"ero llamado -tipoJusuario a>kSEX-. c OwhoamiO 7 &etline "s"ario i' ? "s"ario e MrootM A c print' ?O<oy s"per"s"arioQnOAP d elsec print' ?O<oy "s"ario normalQnOAP d d

E&ecute lo con
$ aw> 0' tipo_"s"ario+aw>

No pretendemos con este sencillo e&emplo !ue sea capa# de usar estas funciones El mane&o de estas redirecciones es complicado + en ocasiones se "ace necesario for#ar el cierre de una entrada o de un pipe Para eso e$iste la funcin -close- (e usa "aciendo -close (?fic"ero?)- o -close (?>"oami?)Por el momento nos conformamos con lo e$plicado + 'eremos un poco ms adelante el uso de %etline tomando la entrada de un fic"ero cuando e$pli!uemos los arra+s asociati'os Arra4s ,os arra+ permiten el almacenamiento de una serie de elementos !ue pueden ser accedidos mediante un ndice En realidad los arra+s de a>k son ms potentes !ue los arra+s !ue 'imos cuando estudiamos la pro%ramacin de la bourneGs"ell donde los ndices de un arra+ eran siempre nmeros enteros Vamos a usar en primer lu%ar los arra+s de esta forma Es decir nos 'amos a limitar en los primeros e&emplos a usar nmeros enteros como ndices Vamos a usar a>k para procesar la salida obtenida con -ps- Primero 'amos a suponer !ue obtenemos un listado completo de los procesos del sistema en formato lar%o (i intenta reali#ar este e&emplo obtendr un resultado necesariamente diferente

0 ps a$l K psGa$l out S cat psGa$l out


,TAX< @BB CB CB :CB :CB @CB @CB @CB @CB @CB @CB CB @CB @CB CB CB CB @CB @BB @BB @BB @BB @BB @BB @CB @CB @CB @CB @CB B B @BB B CB CB B B @BB @BBBBB L-H B B B B B B B @ B B B 3@ B B B @ B B B B @BB@ B B @BB@ 33 33 33 33 33 @BB@ @BB@ B @BB@ @BB@ @BB@ B @BB@ @BB@ @BB@ !-H @ 8 3 C E @:; @:: @D3 @DE 8BB 8@B 88; 833 8C@ 8CC 8EC 8E3 8;8 8;: 8;D 83B 83@ 838 833 83C 83E 83; 833 83: D@; @B8D @B3C @B33 @BC8 @BCE @BEB @BE: @BE@ @B3C !!-H !RB B @ B @ B @ B @ B @ B @ B @ B @ B @ B @ B @ B @ E @ B @ B @ B @ E @ B @ B @ B @ B @ B @ B @ B 8;8 B 8;8 B 8;8 B 8;8 B 8;8 B 83B B 833 B @B8D @8 @B8D B @B33 B @B33 B @BC8 B @BCE B @BEB @C @BE@ @3 .B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B <-UE 3E; B B B B DBB @B@; 3:B :;B 3;C DB: 33:C @38: @8D8 @ECC :CB :;B @3:B @D;C :3; 8BD; :3; :3; 8B:: @3D8 @3D8 @3D8 @3D8 @3D8 3E3; @D@; ::8C C;8B @38: @38: 8D3; 838B 8B:B @B;: R<< B B B B B 8BB B B B @B: B B 3@; @:C E; D; @;C ;B ;@; B 38C B B @CB: B B B B B @;CB ;;: 38:B 83C: D8C D8C @:38 @88B @CBB E8: \CHA. do_select bd'l"sh >"pdate >piod >swapd do_select do_syslo& do_select do_select nanosleep do_select do_select do_select do_select do_select nanosleep nanosleep do_select read_chan read_chan waitC read_chan read_chan waitC wait_'or_co 'loc>_loc>_ 'loc>_loc>_ 'loc>_loc>_ 'loc>_loc>_ do_select waitC do_select do_select waitC waitC do_select do_select waitC <IA <\ <\ <\ <\ <\ < <\ <\ <\ < <\ <\ < < < < < < < <\ < <\ <\ < <\ <\ <\ <\ <\ < < < < < < < < < R IIJ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ @ 8 3 C E ; [ [ [ [ [ 3 ; [ ; ; ; ; ; pB pB I-KE BVB3 BV@: BV@: BVBB BV@E BVBB BVBB BVBB BVBB BVBB BVBB BVBB BVBB BVB@ BVBB BVBB BVBB BVB3 BVBB BVBB BVBB BVBB BVBB BVBB BVBB BVBB BVBB BVBB BVBB BVBB BVBB BVB8 BVB@ BVBB BVBB BVBB BVBB BVBB BVBB COKKA.H ?initA ?>'l"shdA ?>"pdateA ?>piodA ?>swapdA MsbinMsys ?>lo&dA ?portmapA ?inetdA M"srMsbin ?lpdA ?postmast sendmailV M"srMsbin M"srMbinM M"srMsbin M"srMsbin M"srMsbin 0bash ?&ettyA 0bash ?&ettyA ?&ettyA 0bash ?apacheA ?apacheA ?apacheA ?apacheA ?apacheA vi aw>@+d xinit Mho 9 VB 0bpp mwm bash Mhom bash Mhom xterm 0ls xcloc> 0d 0bash ps axl

Para dar una idea de la situacin de parentescos entre los distintos procesos mostramos la salida obtenida con el comando -pstree- e&ecutado desde la misma sesin de $term !ue en el caso anterior

stree Gp K pstreeGp out S cat pstreeGp out

it?@A020apache?8;8A020apache?83CA 7 70apache?83EA 7 70apache?83;A 7 70apache?833A 7 =0apache?83:A 70atd?8ECA 70bash?8;:A 70bash?83BA000vi?D@;A 70bash?833A000xinit?@B8DA0209,:;_<3V?@B3CA 7 =0mwm?@B33A020+xinitrc?@BC8A000xterm?@BEBA000bash?@BE@A000pstree?@B; 7 =0+xinitrc?@BCEA000xcloc>?@BE:A 70cron?8E3A 70&etty?8;DA 70&etty?83@A 70&etty?838A 70&pm?8BBA 70inetd?@DEA 70>'l"shd?8A 70>lo&d?@::A 70>piod?CA 70>swapd?EA 70>"pdate?3A 70lpd?8@BA 70portmap?@D3A 70postmaster?88;A 70sendmail?833A 70sshd?8C@A 70syslo&d?@:;A =0x's?8CCA

(olo 'amos a procesar los campos P@D + PP@D 0L + 0A respecti'amente ,os meteremos en un par de arra+s llamados pid + ppid
SEX-. c ind=BP d

'"nction padre?pAc 'or ?i=BP i %indP i22Ac i' ?pid5i6== pA ret"rn ppid5i6P d d b M,TAX<M c pid5ind6=$3 P ppid5ind6=$C P ind22 P d E.H c do c print' ?O^d0/O* procAP proc= padre?procAP d while ? proc /= @ A print' ?OQnQnOAP d

2"ora e&ecutamos pasando el pid del proceso del cual deseamos a'eri%uar su descendencia
$ aw> 0' ancestros+aw> proc=@BE@ % ps0axl+o"t @BE@0/@BEB0/@BC80/@B330/@B8D0/8330/@0/

Con un nmero realmente reducido de lneas de cdi%o acabamos de procesar la salida de un comando !ue no estaba especialmente dise6ado para ser procesado sino para entre%ar un resultado le%ible No se emocione toda'a por!ue solo "emos utili#ado los arra+s con indices num5ricos ,o cierto es !ue los arra+s de -a>k- a diferencia de los arra+s de otros len%ua&es son arra+s asociati'os Eso

si%nifica !ue podemos usar como ndice una cadena de caracteres Por e&emplo podemos "acer lo si%uiente1 nombreJcli_?B3AL4Ea/?`Q?,uis. =arca Toledano? No es necesario dar un tama6o al arra+ *n arra+ asociati'o no establece un orden entre sus elementos /a+ !ue aclarar !ue el mane&o de un arra+ con ndices num5ricos corresponde a un mecanismo mu+ simple +a !ue se usan porciones consecuti'as de memoria del ordenador + se accede directamente por posicin Por el contrario un arra+ asociati'o de las caractersticas de -a>kse 'a creando dinmicamente @nternamente -a>k- %estiona el acceso mediante una t5cnica de "as" !ue usa tablas au$iliares a modo de tablas de ndices + funciones au$iliares !ue obtiene 'alores num5ricos a partir de 'alores de una cadena Todo ello permite un acceso mu+ rpido en este tipo de estructuras "aci5ndolas adecuadas para su uso en bases de datos
,IT<L<E 7CLR<O< 7,ITin"xCo"rse para <"<E 7 @@:BB ,ITREHH 7CLR<O< 7,ITin"xCo"rse para RedHat 7 @@:BB A<L<COK 7HARH\ARE7As"scom -<H.Tin> @8:> Adapter ?!C-A 7 ;:;E RA-TROAH7]LEXOCOK7Railroad Iycoon ?Xold EditionA 7 33BB C-V-T-U 7]LEXOCOK7Civili(ationV Call to power 7 33BB KJIH-- 7]LEXOCOK7Kyth -7 33BB T-A!!HEV7T-SRO< 7Tin"x Application Hevelopment ?E33 !F&inasA 7 @@BBB CO.ECIB@7T-SRO< 7X"Na del Ls"ario de Tin"x ?C@3 !F&inasA 7 E3BB CO.ECIB37T-SRO< 7X"Na del <ervidor ?Conectiva Tin"x C33 !F&inasA 7 E3BB CO.ECIB87T-SRO< 7X"Na del Administrador de redes ?C;E !F&inasA 7 E3BB T-L<RE<L7T-SRO< 7Tin"x Lser$s Reso"rce ?3DE !F&inasA 7 @8BBB RH3BHTL97T-.L9COK7RedHat Tin"x 3+B Hel"xe en espaWol 7 D;BB RH3B!RO,7T-.L9COK7RedHat Tin"x 3+B !ro'esional en EspaWol 7 8BBBB <L<E3B 7T-.L9COK7<"se Tin"x 3+B ?;CHsA?Version espaWolaA 7 ;:EB RI-KE88 7T-.L9COK7RealIime 8+8 ?@CHA 7 @3BBB CO.CIEBE7T-.L9COK7Conectiva Tin"x E+B Versi)n Econ)mica EspaWol ?;CHsA 7 E8BB C-I-L<887T-.L9COK7Tin"x Citi"s 8+8 7 33EB IRST-\;B7T-.L9COK7I"rbolin"x \or>station ;+B 7 ;EBB KOI-, 7T-.L9COK7Koti' Complete 7 88BBB CO.CI<RV7T-.L9COK7Conectiva Tin"x Ed+<ervidor ?EspaWol 3CHs 2 C Kan"a 7 83EBB RHORA:- 7T-.L9COK7RedHat Tin"x Enterprise Edition optimi(ed 'or Oracle:i 783BBBB KA.HRA387T-.L9COK7Kandra>e 3+8 ?3CHsA !ower!ac> Hel"xe ?versi)n espaWola7 :3BB !-.XL-.O7<L<E!ROK7!in&gino de pel"che 7 ;BBB SEX-. c ,<=O5Q Qt64Q75Q Qt64O P while ? &etline % Oartic"los+datO / BA c artic5$@6= O?O $C O !tas 2 -vaA O $3P print' ?O^s O* $@AP d 'or ?PPAc print' ?OQnQn-ntrod"(ca "n c)di&o de artNc"lo o solo &etline codi&o P i' ?codi&o == OO A brea>P print' ?OQn%^s/Qn^sO* codi&o* artic5codi&o6AP d d

para terminarV OAP

$ aw> 0' artic"los+aw> ,IT<L<E ,ITREHH A<L<COK RA-TROAH C-V-T-U KJIH-- T-A!!HEV CO.ECIB@ CO.ECIB3 CO.ECIB8 T-L<RE<L RH3BHTL9 RH3B!RO, <L<E3B RI-KE88 CO.CIEBE C-I-L<88 IRST-\;B KOI-, CO.CI<RV RHORA:- KA.HRA38 !-.XL-.O -ntrod"(ca "n c)di&o de artNc"lo o solo para terminarV RH3B!RO,

?8BBBB !tas 2 -vaA RedHat Tin"x 3+B !ro'esional en EspaWol -ntrod"(ca "n c)di&o de artNc"lo o solo ?33EB !tas 2 -vaA Tin"x Citi"s 8+8 -ntrod"(ca "n c)di&o de artNc"lo o solo $ para terminarV para terminarV C-I-L<88

El pro%rama !ue acabamos de reali#ar ilustra la potencia de -a>k- para el tratamiento de fic"eros de datos (i nuestro fic"ero de datos de e&emplo -articulos dat- tu'iera un nmero de re%istros muc"o ma+or "abramos notado !ue inicialmente se tarda un cierto tiempo en leer todo el fic"ero de datos pero una 'e# almacenados los datos en el arra+ su acceso a los mismos es rapidsimo Esta rpide# se debe no solo a !ue los datos +a "an sido leidos desde el disco duro + +a estn en memoria sino por!ue toda la informacin est inde$ada de forma !ue la locali#acion de cual!uier elemento del arra+ es mu+ rpida Naltan muc"as cosas por contar sobre -a>k- (i dispone de al%n fic"ero de datos de interes personal sa!ue una copia e intente reali#ar al%una utilidad en -a>k-

E2ercicios res#el!os e S+ell.Scrip!


<ueno es "ora de !ue pruebe sus conocimientos No se preocupe si no consi%ue resol'erlos todos Para al%o estn las soluciones aun!ue eso si. tendr !ue descar%ar el arc"i'o e&erc3 tar %# Disculpe la molestia pero con esto e'itamos !ue sus o&os se des'en a la solucin antes de tiempo
0000 donde_esta+txt 0000 Hacer "n shell0script #"e b"s#"e la presencia del comando pasado como ar&"mento en al&"no de los directorios re'erenciados en la variable $!AIH* seWalando s" locali(aci)n y "na breve descripci)n del comando caso de existir s" pF&ina man+

0000 estadisticas_dir+txt 0000 !ro&rame "n script llamado $estadistica_dir+sh$ #"e realice "n est"dio de todo el arbol de directorios y 'icheros partiendo del directorio pasado como parFmetro de 'orma #"e obten&amos la si&"iente in'ormaci)nV .Gmero .Gmero .Gmero .Gmero .Gmero .Gmero de de de de de de 'icheros 'icheros 'icheros 'icheros 'icheros 'icheros en en en en en en los los los los los los c"ales disponemos de permiso de lect"ra = c"ales disponemos de permiso de escrit"ra = c"ales disponemos de permiso de eRec"ci)n = c"ales carecemos de permiso de lect"ra = c"ales carecemos de permiso de escrit"ra = c"ales carecemos de permiso de eRec"ci)n =

.Gmero de 'icheros re&"lares encontrados =

.Gmero de directorios .Gmero de dispositivos de blo#"es .Gmero de dispositivos de carateres .Gmero de 'i'os

encontrados encontrados encontrados encontrados

= = = =

0000 &en_men"8+txt 0000 !ro&ramar "n shell0script #"e admita como ar&"mentos pareRas 'ormadas por $comando$ y $descripcion$ y #"e constr"ya con todo ello "n men" de opciones donde c"al#"iera de los comandos p"eda ser eRec"tado seleccionando la descripcion correspondiente+ Es decir si dicha shell0script se llamara $&en_men"8+sh$ "n eRemplo de "so serNaV +M&en_men"8+sh Q Tistar ls Q $a"ien estF conectado$ who Q $,echa act"al$ date Q Oc"pacion d" Q $a"ien soy$ whoami Q $Kemoria libre$ 'ree Q $Calendario$ cal Q $.ombre mF#"ina$ hostname Con ello se obtendrNa "n men" de la 'ormaV B @ 8 3 C E ; 3 : Ierminar Tistar a"ien estF conectado ,echa act"al Oc"pacion a"ien soy Kemoria libre Calendario .ombre mF#"ina

EliRa opci)n+

0000 &ra'ica+txt 0000 Reali(ar "n shell0script #"e reciba como ar&"mentos n"meros comprendidos entre @ y 3E+ Hara error en caso de #"e al&"n ar&"mento no este dentro del ran&o y terminarF sin hacer nada+ En caso contrario &enerarF "na linea por cada ar&"mento con tantos asteriscos como indi#"e s" ar&"mento+

0000

incr+txt

0000

Hacer "n shell0scritp #"e "tilice dos '"nciones $incr@?A$ e $incr8?A$ las c"ales eRec"taran "n simple b"cle iterando @BBB veces+ Ta '"nci)n $incr@?A$ solo "sara "n contador -.H@ #"e sera incrementado de "no en "no "sando "n comando de tipo $let$ y la '"ncion $incr8?A$ solo "sara "n contador -.H8 #"e se incrementarF de "no en "no calc"lando s" si&"iente valor mediante el "so del comando expr+ Hacer "na tercera '"nci)n $!r"ebaHie(<e&"ndos?A$ #"e aceptarF como ar&"mento el nombre de la '"ncion de pr"eba ?incr@ o incr8A+ !rimero in'ormara del tiempo real* de cp" de "s"ario y de cp" del sistema #"e cons"me dicha '"nci)n y l"e&o deberF eRec"tar dicha '"nci)n tantas veces sea posible

en el transc"rso de @B se&"ndos ?aproximadamente* basta "sar date $2^s$A obteniendose el nGmero de veces #"e se eRec"to en esos die( se&"ndos+ Compare los res"ltados obtenidos con ambas '"nciones y expli#"e los res"ltados+

0000 lista_'ich+txt 0000 Hacer "n shell0script #"e acepte como ar&"mentos nombres de 'icheros y m"estre el contenido de cada "no de ellos precedido de "na cabecera con el nombre del 'ichero

0000 media+txt 0000 Hacer "n shell0script #"e calc"le la media aritm1tica de todos los ar&"mentos pasados como parFmetros con "na precisi)n de CB di&itos decimales desp"es de la coma+

0000 mi_banner+txt 0000 Tocalice en s" sistema la "tilidad $banner$ para consola+ !"ede haber mas de "na "tilidad para esto y al&"nas estFn pensadas para s" "so con impresora+ .os interesa la "tilidad $banner$ para terminal de 'orma #"e el comando $banner hola$ &enere la si&"iente salidaV

!artiendo de esta "tilidad realice "n shell0script $mi_banner+sh$ #"e admita hasta tres ar&"mentos de tamaWo mFximo de c"atro caracteres tal #"e el comando $+Mmi_banner+sh hola Rose l"is$ obten&aV ooooooooo oooooooo _M _M _M_M_M_M _M _M_M ooooooo _M _M _M _M _M _M _M oooooo _M_M_M_M_M_M _M _M _M _M _M ooooo _M _M _M _M _M _M_M_M_M_M_M oooo _M _M _M _M _M _M _M ooo _M _M _M_M_M_M _M_M_M_M_M_M _M _M oo ooooooooo oooooooo _M _M_M_M_M _M_M_M_M _M_M_M_M_M_M ooooooo _M _M _M _M _M oooooo _M _M _M _M_M_M_M _M_M_M_M_M ooooo _M _M _M _M _M oooo _M _M _M _M _M _M _M ooo _M_M_M_M _M_M_M_M _M_M_M_M _M_M_M_M_M_M oo ooooooooo oooooooo _M _M _M _M _M_M_M_M ooooooo _M _M _M _M _M oooooo _M _M _M _M _M_M_M_M ooooo _M _M _M _M _M oooo _M _M _M _M _M _M ooo _M_M_M_M_M_M _M_M_M_M _M _M_M_M_M oo

0000 mi_cal@+txt 0000 Reali(ar "n shell0script $mi_cal@+sh$ #"e "titil(ando la salida del comando $cal$ 'iltre s" salida para resaltar entre corchetes el dNa act"al+ !on&a atenci)n a los dNas a principio de lNnea* los dNas a 'inal de lNnea+ Ta salida para el dNa +Mmi_cal@+sh < 5E6 @8 @D 8; Kay 8BB8 K I" ; @3 8B 83 3 @C 8@ 8: \ @ : @E 88 8D Ih 8 D @; 83 3B , 3 @B @3 8C 3@ < C @@ @: 8E E de Kayo de 8BB8 deberNa ser la si&"ienteV

.o es "n eRercicio trivial+ .ecesitarF hacer "n 'iltrado en varios pasos+ Ltilice al&"na combinaci)n de 'iltros sed encadenados con pipe+ !ara poder comprobar #"e el pro&rama '"nciona correctamente para los distintos dNas hacer #"e en caso de pasar "n ar&"mento este serF considerado el dNa del mes+ +Mmi_cal@+sh @ < E @8 @D 8; Kay 8BB8 K I" ; @3 8B 83 3 @C 8@ 8: \ 5@6 : @E 88 8D Ih 8 D @; 83 3B , 3 @B @3 8C 3@ < C @@ @: 8E

0000 mi_cal8+txt 0000 Sasandose en el eRercicio anterior reali(ar "na modi'icaci)n de $mi_cal@+sh$ #"e llamaremos $mi_cal8+sh$ #"e en l"&ar de encadenar varios comandos sed con pipes crearF "n 'ichero temporal $MtmpM$B+$$+sed$ para ser "sar mediande la opci)n 0' de sed+ Ambos scrits deberFn prod"cir id1ntico res"ltado+

0000 mi_lo&rotate+txt 0000 As"miremos #"e tenemos en "n directorio "na serie de 'icheros de lo& #"e van creciendo de 'orma ilimitada con el "so re&"lar de ciertos pro&ramas+ Reali(ar "n shell0script #"e act"e sobre los 'icheros con nombre tipo $4+lo&$ del directorio act"al de 'orma tal* #"e si al&"no de ellos s"pera en tamaWo las 8BBB lineas* deRarF solo las Gltimas @BBB lNneas del 'ichero y las restantes serFn &"ardadas en "n directorio old_rot en 'ormato comprimido+ En dicho directorio habrF #"e conservar en 'ormato comprimido no solo la Gltima porci)n eliminada del ori&inal* sino las c"atro Gltimas porciones eliminadas+ !ara ello serF necesario ir rotando los nombres de estos 'icheros comprimidos incorporando en los mismos "n di&ito de sec"encia+ ?parte eliminadaA 00/ 4+lo&+rot@+&( 00/ 4+lo&+rot8+&( 00/ 4+lo&+rot3+&( 00/ 4+lo&+rotC+&( 00/ eliminado El pro&rama d"rante s" eRec"ci)n irF mostrando los 'icheros encontrados

y seWalarF a#"ellos #"e por s" tamaWo sea necesario rotar+

0000 oc"pa_tmp_lo&+txt 0000 Obtiene la oc"pacion de los directorios presentes en el sistema c"yo nombre sea de la 'orma $4tmp$ o $4lo&$* ordenados por orden de oc"pacion+ Hebera mostrar el n"mero de errores provocados por $'ind$+ <i se decide "sar al&(n 'ichero temporal debera "sar el directorio $Mtmp$ para ello y "sar "n nombre #"e conten&a el nombre del proceso #"e lo ori&ino y s" pid+

0000 palabras+txt 0000 Realice "n shell0script #"e admita tres palabras como ar&"mentos y #"e m"estre "n mensaRe in'ormando de las relaciones de i&"aldad y desi&"aldad entre esas palabras+ OTas O<on O<on O<on O<on tres son i&"alesO i&"ales primera y se&"ndaO i&"ales primera y terceraO i&"ales se&"nda y terceraO las tres distintasO

0000 piramide+txt 0000 Realice "n shell0scrip $piramide+sh$ #"e admita como ar&"mento "n nGmero $.$ y #"e opten&a a la salida "na serie de $.$ 'ilas de 'orma trian&"lar+ !ara +Mpiramide+sh @8 la salida serNa+ B@ B8 B3 BC BE B; B3 B: BD @B @@ @8 B8 B3 BC BE B; B3 B: BD @B @@ @8

B3 BC BE B; B3 B: BD @B @@ @8

BC BE B; B3 B: BD @B @@ @8

BE B; B3 B: BD @B @@ @8

B; B3 B: BD @B @@ @8

B3 B: BD @B @@ @8

B: BD @B @@ @8

BD @B @B @@ @@ @@ @8 @8 @8 @8

0000 proceso+txt 0000 Hacer "n shell0script llamado $proceso+sh$ para ser lan(ado en bac>&ro"nd #"e como maximo permanecera vivo 3B se&"ndos+ !odra ser lan(ado varias veces en bac>&ro"nd y cada ve( &enerara "n shell0script distinto $stop_proceso+sh+$ #"e al ser eRec"tado matara el proceso lo ori&ino y desp"es se borrara a si mismo+

0000 vi&ila+txt 0000 Reali(ar "n shell0script #"e escriba en el 'ichero $MtmpM"s"arios$ "na linea con la 'echa y otra con el nGmero de "s"arios distintos #"e estan conectados en ese momento cada dos min"tos+