UNIX, Shell y Sripts Franiso Rosales Gar a Departamento de Arquitetura y Tenolog a de Sistemas Inform atios Faultad de Inform atia Universidad Polit enia de Madrid Febrero 2003 Indie General 1 El Entorno UNIX 1 2 Uso del Shell 15 3 Programaion de Sripts 27 i ii Cap tulo 1 El Entorno UNIX En este apartado intentaremos haernos una idea de uales son las araterstias y los oneptos basios que se manejan en el entorno UNIX. >Que es UNIX? Es sin lugar a dudas uno de los sistemas operativos mas extensos y potentes que hay. Sus prinipales virtudes son: Multiusuario En una maquina UNIX pueden estar trabajando simultaneamente muhos usuarios. Cada usuario tendra la impresion de que el sistema es suyo en exlusiva. Multiproeso Cada usuario puede estar ejeutando simultaneamente muhos proesos. Cada proeso se ejeuta independientemente de los demas omo si fuese el unio en el sistema. Todos los proesos de todos los usuarios son ejeutados onurrentemente sobre la misma maquina, de forma que sus ejeuiones avanzan de forma independiente. Pero tambien podran omuniarse entre si. Multiplataforma El nuleo del sistema operativo UNIX esta esrito en mas de un 95% en lenguaje C. Graias a ello ha sido portado a maquinas de todos los tama~nos y arquiteturas. Los programas desarrollados para una maquina UNIX pueden ser llevados a ualquier otra failmente. <Como es UNIX! Desde el punto de vista del usuario, hay que resaltar las siguientes araterstias: Sensible al tipo de letra. Distingue entre mayusulas y minusulas . No es lo mismo unix que Unix que UNIX. Fiheros de onguraion textuales. Para failitar su ediion sin neesidad de herramientas sostiadas. Para usuarios NO torpes. Otros Sistemas Operativos someten ada aion \peligrosa" (Ej. reesribir un hero) al onsentimiento del usuario. En UNIX, por defeto, se entiende que el usuario sabe lo que quiere, y lo que el usuario pide, se hae, sea peligroso o no. 1 !! Lo borrado es irreuperable. Es un ejemplo del punto anterior. Hay que tener uidado. Como veremos mas adelante existe la posibilidad de que el usuario se proteja de s mismo en este tipo de mandatos. <Como es Linux! POSIX. Es una version de Interfae. UNIX que umple el estandar Portable Operating System Libre. Se distribuye bajo lienia GNU, lo que implia que se debe distribuir on todo su odigo fuente, para que si alguien lo desea, lo pueda modiar a su antojo o neesidad. Evoluiona. Por ser libre, esta en permanente desarrollo y mejora, por programadores voluntarios de todo el mundo. Gratis. Al inreble preio de 0 euros. Contenidos En este aptulo se presenta el entorno UNIX desde el punto de vista de un usuario del mismo. El objetivo es que el usuario se sienta mnimamente onfortable en UNIX. Veremos, en este orden: 1. Usuarios y Grupos 2. Sesion 3. Mandatos 4. Proesos 5. Arbol de Fiheros 6. Desriptores de hero 7. Interprete de mandatos 8. Conguraion 9. Xwindows 2 1.1 Usuarios y Grupos Para que una persona pueda utilizar un determinado sistema UNIX debe haber sido previamente dado de alta omo usuario del mismo, es deir, debe tener abierta una uenta en el sistema. Usuario Todo usuario registrado en el sistema se identia ante el on un nombre de usuario (login name) que es unio. Cada uenta esta protegida por una ontrase~na (password) que el usuario ha de introduir para aeder a su uenta. Internamente el sistema identia a ada usuario on un numero unio denominado UID (User Identier). Grupo Para que la administraion de los usuarios sea mas omoda estos son organizados en grupos. Al igual que los usuarios, los grupos estan identiados en el sistema por un nombre y por un numero (GID) unios. Cada usuario pertenee al menos a un grupo. Privilegios Las operaiones que un usuario podra realizar en el sistema estaran delimitadas en funion de su identidad, esto es por la pareja UID-GID, as omo por los permisos de aeso al hero o reurso al que desee aeder. Superusuario De entre todos los usuarios, existe uno, denominado \superusuario" o root que es el enargado de administrar y ongurar el sistema. Es aquel que tiene omo UID el numero 0 (ero). El superusuario no tiene restriiones de ningun tipo. Puede haer y deshaer lo que quiera, ver modiar o borrar a su antojo. Ser superusuario es una labor deliada y de responsabilidad. La administraion de un sistema UNIX es ompleja y exige amplios onoimientos del mismo. 1.2 Sesion Una sesion es el periodo de tiempo que un usuario esta utilizando el sistema. Como sabemos, ada usuario tiene una uenta que estara protegida por una ontrase~na o password. Ahora siga los siguientes pasos para entrar y salir del sistema. § login: myname ¦ § T 1.1 ¥ Para entrar al sistema introduza su nombre de usuario o login name. passwd: ******* ¦ ¤ ¤ T 1.2 ¥ Si ya ha puesto una ontrase~na debera usted introduirla ahora, para que el sistema verique que usted es quien die ser. 3 ¤ § prompt> ¥ ¦ Al entrar en el sistema se arrana un programa que nos servira de interprete de mandatos. Nos presenta un mensaje de apremio. § T 1.4 logout ¦ ¤ ¥ £ Para terminar una sesion debera usar este mandato o bien ¢exit ¡. 1.3 Mandatos Todos los sistemas operativos tienen mandatos que failitan el uso del sistema. Su forma general es: mandato [opiones℄ [argumentos...℄ Los ampos estan separados por uno o mas espaios. Algo entre orhetes [ ℄ es opional. La notaion ... india uno o varios. Las opiones generalmente omenzaran por un - (menos). A lo largo de esta presentai on se ir a soliitando que usted realie numerosas pr atias, observe el omportamiento del sistema o onteste preguntas... p Ahora debe usted entrar en el sistema omo se indio en el apartado anterior. T 1.5 UNIX distingue entre mayusulas y minusulas. T 1.6 !! Observe que T 1.7 ? Conteste, >sabra usted terminar la sesion? ...en muhos asos se sugerir a que ejeute iertos mandatos... £ T 1.8 ¢who am i ¡ Obtenga informaion sobre usted mismo. £ T 1.9 ¢date ¡ Conoza la feha y hora. £ T 1.10 ¢al ¡ Visualie un alendario del mes atual. ...se dar an m as expliaiones para ampliar sus onoimientos... La mayora de los mandatos reonoen las opiones -h o --help omo petiion de ayuda sobre el mismo. ...y se soliitar a que realie m as pratias... £ T 1.11 T 1.12 ¢date ? -h ¡ Aprenda que opiones admite este mandato. >Que da de la semana fue el da en que usted naio? ...as mismo, durante esta presentai on iremos introduiendo un resumen de algunos mandatos que se onsideran m as importantes. Si desea informaion ompleta sobre algo, debera usar el mandato man. 4 T 1.3 man [what℄ Manual Pages Visualiza una opia eletronia de los manuales del sistema. Es seguro que nos asaltara a menudo la duda de omo usar orretamente algun mandato o ualquier otra osa. Deberemos onsultar el manual. Los manuales se dividen en seiones: 1 Mandatos (Ej. sh, man, at). 2 Llamadas al sistema (Ej. open, umask). 3 Funiones de librera (Ej. printf, fopen). 4 Dispositivos (Ej. null). 5 Formato de heros (Ej. passwd). 6 Juegos. 7 Miselanea. 8 Mandatos de Administraion del Sistema. £ ¢man -h ¡ £ ¢man man ¡ T 1.13 Busque ayuda breve sobre el mandato man. T 1.14 Lea la doumentaion ompleta del mandato man. § ¤ ¦ ¥ man [1-8℄ intro En aso de onito, si ejemplo existe en diferentes seiones la misma hoja de manual, debera expliitar la seion en la que busar. La hoja intro de ada seion informa de los ontenidos de la misma. Algunos mandatos utiles A ontinuaion se itan algunos de los muhsimos mandatos disponibles en UNIX. Si neesita mas informaion sobre alguno de ellos, onsulte el manual. pwd Visualizaion del diretorio atual de trabajo. d Cambio del diretorio atual de trabajo. mkdir Creaion de diretorios. rmdir Eliminaion de diretorios. eho Muestra el texto que se indique por su salida. env Muestra el valor de las variables de entorno. ls Listado del ontenido de un diretorio. at Visualizaion del ontenido de un hero. 5 T 1.15 pio Un senillo editor de heros. vi El editor de heros mas extendido en entorno UNIX. emas El editor de heros mas potente disponible. rm Eliminaion de hero. p Copiar heros. mv Mover o renombrar heros. w Contar las palabras y lneas de un hero. grep B usqueda de una palabra en un texto. sort Ordenaion de heros. find B usqueda de heros que umplen determinadas araterstias. hmod Cambio de los permisos de un hero. sleep Simplemente espera que transurra los segundos indiados. id Muestra la identidad del usuario que lo ejeuta. 1.4 Proesos Cando usted invoa un mandato, el hero ejeutable del mismo nombre es ejeutado. Todo programa en ejeuion es un proeso. Todo proeso de identia por un numero unio en el sistema, denominado PID (Proess Identier). Conurrenia En todo momento, ada proeso ativo de ada usuario del sistema, esta ompitiendo on los demas por ejeutar. El sistema operativo es el que mara a quien le toa el turno en ada momento. Todo esto suede muy muy deprisa, on el resultado de que ada proeso avanza en su ejeuion sin notar la presenia de los demas, omo si fuera el unio proeso del sistema, pero en realidad todos estan avanzando simultaneamente. A esta idea se le denomina onurrenia. T 1.16 T 1.17 £ ¢ ¡ ps Permite ver una instantanea de los proesos en el sistema. Admite multitud de opiones. § ¤ ¦ ¥ top Permite observar la atividad de los proesos en el sistema on ierta periodiidad. 6 Jerarqua de proesos Todos los proesos del sistema se organizan en una jerarqua padre{hijo(s) que tiene omo anestro ultimo al proeso denominado init uyo PID es 1. Todo proeso tiene tambien asoiado un numero que identia a su proeso padre, es el PPID. § ¤ ¦ ¥ pstree Permite ver una instantanea de la jerarqua de proesos en el sistema. Admite multitud de opiones. 1.5 Arbol de Fiheros Existe una unia estrutura jerarquia de nombres de hero, es deir, no existe el onepto de \unidad". En UNIX los dispositivos se \montan". Diretorio raz La raz de la jerarquia de nombres es el denominado diretorio raz y se denota on el arater / (dividido por) no por el \ (bakslash). Diretorio HOME Nada mas entrar en el sistema, el usuario es situado en el denominado diretorio HOME de su uenta. Cada uenta tiene su propio HOME, que es reado por el administrador del sistema al abrirle la uenta al usuario. Este diretorio pertenee al usuario orrespondiente. Por debajo de el podra rear uantos subdiretorios o heros quiera. Tipos de objeto Para averiguar que es o que hay ontenido bajo un nombre de hero puede usar el mandato file. Existen (basiamente) 3 tipos de \objetos", a saber: Diretorios: Es un ontenedor uyas entradas se reeren a otros heros y/o diretorios. El uso de los diretorios da lugar a la jerarqua de nombres. Todo diretorio ontiene siempre las siguientes dos entradas: . (punto) Se reere al mismo diretorio que la ontiene. .. (punto punto) Se reere al diretorio padre de este, es deir, a su padre en la jerarqua. Fiheros normales: Estan ontenidos en los diretorios. Contienen seuenias de bytes que podran ser odigos de programas, datos, texto, un fuente en C o ualquier otra osa. 7 T 1.18 Fiheros espeiales: Son omo heros normales, pero no ontienen datos, sino que son el interfaz de aeso a los dispositivos periferios tales omo impresoras, disos, el raton, et, et. Cada dispositivo, existente o posible, se haya representado por un hero espeial que se enuentra bajo el diretorio /dev. UNIX trata estos heros espeiales (y por lo tanto a los dispositivos) exatamente igual que trata a los heros normales, de forma y manera que para los programas, los unos y los otros son indistinguibles. pwd Print Working Diretory Permite averiguar ual es el diretorio en que nos enontramos en ada momento, al ual denominamos diretorio atual de trabajo. T 1.19 § ¤ ¦ ¥ pwd T 1.20 !! T 1.21 !! Visualie su diretorio atual de trabajo. Observe que se muestra el amino absoluto (desde el diretorio raz) de su diretorio HOME. Observe que las omponente de un amino se separan entre s on el arater / (dividido por) y no por el \ (bakslash). d [dir℄ Change Diretory Con este mandato ambiamos de un diretorio a otro. Admite omo argumento el nombre del diretorio al que queremos ambiar. Existen tres asos espeiales que son de utilidad. £ ¢d £ ¡ Invoado sin argumento, nos devuelve diretamente a nuestro HOME. ¢d . ¡ El diretorio de nombre . (punto) hae referenia siempre al diretorio atual de trabajo. Realmente no nos va a ambiar de diretorio. § ¤ ¦ ¥ pwd T 1.22 Observe que permaneemos en el mismo diretorio. Como veremos mas adelante, el diretorio . resulta util para referirnos a heros que \estan aqu mismo". £ ¢d .. ¡ Todo diretorio ontiene siempre una entrada de nombre .. (punto punto) que hae referenia siempre al diretorio padre del diretorio atual. T 1.23 § ¤ ¦ ¥ pwd Observe que asendemos al diretorio padre. 8 £ ¢d .. ¡ T 1.24 Repita la operaion hasta llegar al raz. § ¤ pwd ¥ T 1.25 ¦ £ ¢d ¡ Observe que no se puede ir mas alla del diretorio raz. T 1.26 >A que diretorio hemos ido? ls [-opt℄ [dirs...℄ List Diretory Contents Este mandato nos presenta informaion sobre los heros y diretorios ontenidos en el(os) diretorio(s) espeiado(s). Si no se india ningun diretorio, informa sobre el diretorio atual de trabajo. Este mandato admite antidad de opiones que onguran la informaion obtenida. Entre ellas las mas usadas son, por este orden: -l Formato \largo". Una lnea por hero o diretorio on los ampos: permisos, propie- tario, grupo, tama~no, feha y nombre. -a Informa tambien sobre los nombres que omienzan por . (punto), que normalmente no se muestran. -R Desiende reursivamente por ada subdiretorio enontrado informando sobre sus ontenidos. Si neesita explorar mas opiones, onsulte el manual. £ ¢ls ¡ £ ¢ls £ Pero no lo esta. Al menos siempre apareera las entradas . y ... £ T 1.28 Es posible que aparezan otros nombres que on ¢ls ¡no vio. Este mandato evita mostrar aquellas entradas que omienzan por el arater punto. Podramos deir que los heros o diretorios uyo nombre omienza por un punto estan "oultos", pero se pueden ver si usamos la opion -a. Suelen ser heros (o diretorios) de onguraion. T 1.29 -la ¡ T 1.30 Si queremos onoer los detalles del "objeto\ asoiado a ada entrada de un diretorio, usaremos la opion -l. ? § HOME paree estar vao. -a ¡ !! ¢ls Observe que su diretorio T 1.27 >A quien perteneen los heros que hay en su >Que tama~no tienen? >Cuando fueron modiados por ultima vez? HOME? T 1.31 ¤ ls /home ¥ ¦ Observe el HOME de otros usuarios de su sistema. Inspeione el ontenido de sus diretorios. 9 T 1.32 ¤ § ls -la / ¥ ¦ Muestra el \trono" del arbol de nombres. £ T 1.34 ¢man Lea una desripion ompleta de la jerarqua del sistema de heros UNIX que esta usando. ¤ § T 1.35 7 hier ¡ ls -??? /bin ¥ ¦ Obtenga el ontenido del diretorio /bin ordenado de menor a mayor el tama~no de los heros. T 1.36 !! Observe que aparee un hero de nombre ls. Ese es el hero que usted esta ejeutando ada vez que usa el mandato ls. Esos heros son solo una parte de los usted podra ejeutar, hay muhos mas. T 1.37 ? >A quien pertenee el hero /bin/ls? T 1.38 !! Sus permisos permiten que usted lo ejeute. 1.6 Desriptores de hero Los proesos manejan heros a traves de los denominados desriptores de hero. Por ejemplo, el resultado de abrir un hero es un desriptor. Las posteriores operaiones de manejo (letura, esritura, et.) de este hero reiben omo parametro el desriptor. Desde el punto de vista de nuestro programa, un desriptor no es mas que un numero entero positivo (0, 1, 2, ...). Desriptores estandar Los tres primeros desriptores de hero son los denominados \estandar", y se onsidera que siempre estan disponibles para ser usados. Normalmente estaran asoiados al terminal pero podran estar asoiados a un hero o a ualquier otro objeto del sistema de heros, pero este es un detalle que no ha de preouparnos a la hora de programar. Los programas que se omporten de forma \estandar" los utilizaran adeuadamente. Entrada estandar. Es la entrada prinipal al programa. Los programas que se omportan de forma estandar reiben los datos que han de proesar leyendo de su entrada estandar (desriptor de hero numero 0). Salida estandar. Es la salida prinipal del programa. Los programas que se omportan de forma estandar emiten sus resultados esribiendo en su salida estandar (desriptor de hero numero 1). Error estandar. Es la salida para los mensajes de error del programa. Si un programa que se omporta de forma estandar ha de emitir un mensaje de error debera haerlo a traves de su error estandar (desriptor de hero numero 2). 10 T 1.33 1.7 Interprete de mandatos La interaion del usuario on el sistema UNIX puede ser a traves de un interfaz grao, pero lo mas omun es que sea a traves de un interfaz textual, esto es, a traves del dialogo on un interprete de mandatos. En UNIX se denomina shell (onha) al interprete de mandatos, esto es, el programa apaz de interpretar y poner en ejeuion los mandatos que el usuario telea. No existe un unio shell sino muhos. ¤ § ls -l /bin/*sh ¥ ¦ T 1.39 Los heros que apareen son los diferentes shell disponibles. Quizas apareza algun otro hero. Quizas aparezan enlaes simbolios (otro tipo de objeto del sistema de heros). Se distinguen fundamentalmente en la sintaxis que reonoen y en las failidades que proporionan para su uso interativo y para usarlos omo lenguaje de programaion de \guiones" de mandatos (sripts). sh Es el denominado Bourne Shell. Es el primer shell que se desarrollo para es el preferido para la programaion de sripts. UNIX, y sh El "C"shell. Se llama as porque la sintaxis que reonoe se aproxima a la del lenguaje C. Tambien es uno de los primeros shell desarrollados para UNIX, y se ha preferido para uso interativo. bash Bourne Again Shell, es una version mas evoluionada del sh, mas apta para el uso interativo. tsh Version mejorada del sh, on mas failidades para el uso interativo omo ompletar nombres de hero y ediion de lnea de mandatos. otros Existen otros muhos: ksh, zsh, r, et. (para gustos, olores). Los mas omunes para uso interativo son el tsh y el bash. Ya hemos estado usando el shell, de heho que si esta usted en su uenta, entones esta usted ejeutando uno de ellos en este momento. 1.8 Variables de entorno Ademas de los argumentos que indiamos en su invoaion, ada mandato que ejeutemos reibira una serie de parejas "nombre=valor", que son las denominadas variables de entorno. Las variables de entorno son pasadas de proeso padre a proeso hijo por un meanismo de herenia. Las variables del entorno se utilizan para ongurar iertos omportamientos de los proesos. Por poner algunos ejemplos itaremos las siguientes: HOME Su valor es el nombre del diretorio raz de nuestra uenta en el sistema. 11 !! PATH Enumera un onjunto de diretorios donde se loalizara los ejeutables que invoquemos. TERM India el nombre o tipo del terminal que estemos usando. USER India el nombre del usuario que somos. SHELL Es el nombre ompleto del interprete de mandatos que estemos usando. Existen otras muhas mas variables de entorno, y podramos situar en el entorno ualquier otra informaion que sea de nuestro interes. Podremos visualizar las variables de entorno existentes haiendo uso del mandato env. Variable de entorno PATH Para entender el omportamiento del shell es onveniente profundizar en la mision de la variable de entorno PATH. Cuando le pedimos al shell que ejeute un mandato, este lo busara en los diretorios indiados en la variable de entorno PATH y solo en ellos. Es onveniente que la variable PATH se reera al menos a los diretorios mas omunes, esto es, /bin, /usr/bin y /usr/loal/bin. Por razones de seguridad, es altamente reomendable que el diretorio atual "." NO este inluido en la variable PATH. 1.9 Fiheros de texto ejeutables Si un hero de texto tiene permisos de ejeuion (man hmod) y su primera lnea reza #! ejeutable , podremos ejeutar diretamente este hero, y su ontenido sera ledo he interpretado por el ejeutable. De esta manera podemos rear nuestros propios heros de mandatos ejeutables, que denominamos \guiones" (sripts). p T 1.40 Esriba un hero uya primera lnea sea #! /bin/at , y luego a~nada las lneas de texto de desee. Dele permisos de ejeuion y ejeutelo. Como podra observar, un hero de texto ejeutable no tiene porque estar neesariamente asoiado a un shell, sino que puede asoiarse a ualquier mandato que haga uso de su entrada estandar. Ademas en la primera lnea podemos a~nadir opiones del mandato (una opion omo maximo, aunque puede ser ompuesta). p T 1.41 Modique el hero anterior para que al ser ejeutado uente las lneas y las palabras de s mismo, pero no los arateres. Para ello onsulte el manual sobre el mandato w. Este meanismo, de heros de texto ejeutables nos permitira la realizaion de heros de mandatos, que seran interpretados por el shell de nuestra eleion. 12 1.10 Xwindows Hasta ahora hemos experimentado el uso de UNIX desde un interfaz textual, esto es, desde un terminal. Existe un entorno grao muy potente llamado X windows o simplemente X. £ Para arranarlo podemos usar el mandato ¢startx ¡. 13 14 Cap tulo 2 Uso del Shell En este apartado exploraremos el uso interativo del interprete de mandatos. Vamos a ver algunas araterstias basias del shell que nos seran de muha utilidad. El prompt Cuando el usuario entra en su uenta a traves de un terminal, el sistema arrana un nuevo interprete de mandatos asoiado a diho terminal. Un shell arranado de esta manera esta en modo interativo y nos informara de ello mostrando en el terminal un prompt o mensaje de apremio. Un shell esta a nuestro serviio. En este doumento se muestran los dialogos on el shell de la siguiente manera: ¨ « $ ª El prompt sera el smbolo $. © 2.1 Estado de terminaion Todo mandato UNIX debe terminar devolviendo un valor que permita identiar su estado de terminaion. Un valor distinto de 0 india que ourrio un error de algun tipo, mientras que un valor 0 india que funiono omo se esperaba. En el aso del shell el mandato interno exit permitira terminar indiando el valor de terminaion. exit 0 # Terminaion orreta. Se debe esribir odigo esperando que otros lo usen, por lo tanto, hay que asegurarse de devolver un estado de terminaion signiativo. 2.2 Primer y segundo plano Hasta ahora hemos venido arranando mandatos que \toman el ontrol del terminal" hasta que terminan. Se die de ellos que ejeutan en primer plano (foreground). Podemos soliitar la ejeuion de varios mandatos en primer plano invoando ada uno en una lnea diferente, pero tambien podramos haerlo separandolos on el arater ';'. § ¤ ¦ ¥ sleep 3; ls /; sleep 3; who Observe omo se ejeuta un mandato despues del anterior en estrita seuenia. 15 T 2.1 En UNIX es posible soliitar la ejeuion de mandatos en segundo plano (bakground) poniendo el arater & al nal de los mismos. El mandato se ejeutara en onurrenia on otros mandatos que ejeutemos en primer o segundo plano a ontinuaion. § T 2.2 sleep 3 & ls / & sleep 3 & who & ¦ ¤ ¥ Observe omo se ejeutan onurrentemente y la salida de los mandatos se mezla. 2.3 Redireion En UNIX podemos redirigir la entrada estandar, salida estandar y/o error estandar de los mandatos. Esta es una araterstia muy muy util, ya que, sin neesidad de modiar en absoluto un mandato podemos usarlo para que tome su entrada de un hero en vez de tener que telearla. De igual manera en vez de que la salida del mandato apareza en la pantalla, podramos enviarla a un hero para usarla on posterioridad. La sintaxis orreta para realizar redireiones es a~nadir al nal del mandato la redireion on la siguiente notaion: § mandato < fihero ¦ ¤ ¥ En su ejeuion, el mandato usara fihero omo entrada, leera de el y no del telado. § mandato > fihero ¦ ¤ ¥ En su ejeuion, la salida del mandato sera enviada a fihero y no a la pantalla. Si fihero no existiera on anterioridad, sera reado automatiamente, pero si existe, sera previamente trunado a tama~no ero. § mandato >> fihero ¦ ¤ ¥ A~nade la salida del mandato al nal del hero indiado. § mandato 2> fihero ¦ ¤ ¥ Los mensajes de error que un mandato pueda generar tambien pueden ser redirigidos a un hero, pero normalmente preferimos que se visualien por la pantalla. £ ¢mandato 2>&1 ¡ Redirige la salida de error a donde quiera que este dirigida la salida estandar. p T 2.3 Obtenga en un hero de nombre todos los fiheros un listado en formato largo de todo el arbol de heros reorriendolo reursivamente desde el diretorio raz. Dado que este mandato puede llevar un rato en ejeutar, lo arranamos en segundo plano, para poder seguir realizando otros mandatos. £ T 2.4 T 2.5 ¢ls -l todos los fiheros ¡ Compruebe que tama~no del hero esta aumentando. !! Apareeran en pantalla solo los mensajes de error que el mandato produe al no poder aeder a iertos diretorios. 16 ¤ § T 2.6 grep login name < todos los fiheros > mis fiheros ¦ ¥ Use el mandato grep para ltrar las lneas del hero de entrada que ontienen el texto indiado, en este aso su nombre de usuario. Deje el resultado en un hero de nombre mis fiheros. 2.4 Seuenia Pipeline En UNIX podemos redirigir la salida estandar de un mandato diretamente a la entrada estandar de otro. Con ello onstruimos seuenias de mandatos que proesan el resultado del anterior y emiten su resultado para que sea proesado por el siguiente mandato de la seuenia. Esto lo onseguimos separando los mandatos on el arater \|" (pipe). Esta es es una failidad muy poderosa de UNIX, ya que, sin neesidad de heros intermedios de gran tama~no podemos proesar grandes antidades de informaion. § ¤ ¦ ¥ ls -la /home | grep login name T 2.7 Obtiene un listado en formato largo de todos los diretorios de uentas y ltra aquellas lneas que ontienen nuestro nombre de usuario. !! p p No se rea ningun hero intermedio. T 2.8 Obtenga el listado \todos sus heros" de la seion anterior, onetando el resultado al mandato grep para quedarse solo on sus heros. Mande el resultado a un nuevo hero de nombre MIS fiheros. Pongalo as, on mayusulas, para no mahaar el hero nombrado as pero en minusulas. T 2.9 Reuerde invoar el mandato on & para poder seguir haiendo otras osas. Cuando hayan terminado de ejeutar los mandatos, ompruebe las diferenias entre los heros de nombre mis fiheros y MIS fiheros. Para ello utilie el mandato diff, onsultando el manual si es neesario. T 2.10 Seuenias ondiionales Es tambien posible separar mandatos o seuenias on los siguientes smbolos: && Soliitamos que el mandato o seuenia a la dereha del smbolo solo se ejeute si el de la izquierda termino orretamente. || Soliitamos que el mandato o seuenia a la dereha del smbolo solo se ejeute si el de la izquierda termino inorretamente. £ o bien" ¡ ¢true && eho "El anterior termin T 2.11 ¤ § false || eho "El anterior termino mal" ¥ ¦ 17 T 2.12 2.5 Metaarateres Los metaarateres (wildards) son arateres omodn. Con su uso podemos haer referenia a onjuntos de heros y/o diretorios, indiando la expresion regular que asa on sus nombres. ? Comodn de arater individual. * Comodn de tira de ero o mas arateres. ~ Abreviatura del diretorio home. ~user Abreviatura del diretorio home de user. [ab℄ Casa on un arater del onjunto espeiado entre los orhetes. [x-y℄ Casa on un arater en el rango espeiado entre los orhetes. [^...℄ Niega la seleion indiada entre los orhetes. fstr,. . . g Agrupai on. Casa suesivamente ada tira. p Obtenga un listado en formato largo, de los heros de los diretorios /bin y T 2.13 p T 2.14 /usr/bin/ que ontengan en su nombre el texto sh. Obtenga un listado en formato largo, de los heros del diretorio /dev que omienen por tty y no terminen en dgito. 2.6 Uso interativo Un buen shell para uso interativo ofree serviios que le failitan la tarea al usuario. Esto signia que existen multiples ombinaiones de telas asoiadas on alguna funionalidad espeial. Para onoerlas ompletamente debera onsultar el manual. Ediion de lnea Podemos mover el ursor ( ) sobre la lnea de mandatos que estamos teleando on ! , borrar antes y sobre el ursor on Bakspae y Del , ir al iniio y al nal on Iniio y Fin , et. !! T 2.15 Observe que pasa si intenta editar una lnea mas larga que la pantalla. Historio de mandatos Si hae poo que teleamos un mandato no es preiso volverlo a telear. Basta on busarlo haiendo uso de las ehas del telado " y # . El mandato interno history nos informa de todos los mandatos que hemos usado ultimamente. § T 2.16 history ¦ ¤ ¥ Visualie los mandatos que hasta ahora ha realizado en su shell. 18 Observe que history guarda los mandatos anteriores de una sesion otra. !! T 2.17 £ ¢!! ¡ £ T 2.18 Repite el ultimo mandato. ¢!5 ¡ T 2.19 Repite el mandato que oupa la posiion 5 en la historia. Fin de datos La ombinaion de telas Ctrl D en una lnea vaa india \n de datos". Si la pulsamos y hay algun programa leyendo del terminal, entendera que no hay mas datos y terminara normalmente. £ ¢at ¡ Es un mandato que lo que lee de su entrada lo esribe en su salida. Esriba varias lneas de datos para observar su omportamiento. Como esta leyendo del terminal, para que termine normalmente, debera indiarle \n de datos". § T 2.20 ¤ $ Ctrl ¦ D T 2.21 ¥ El shell tambien es un programa que lee de su entrada estandard. Indquele \n de datos". !! El shell entendera que no hay mas datos, terminara normalmente y por lo tanto nos saara de la uenta. Si ha sido as y este omportamiento no le agrada, hay una forma de ongurar el shell para evitar que sueda. Mas adelante la veremos. Control de trabajos En UNIX podemos arranar mandatos para que se ejeuten en segundo plano (bakground) poniendo el arater & al nal de la lnea. Tambien, desde su shell puede suspender el trabajo que esta en primer plano (foreground), rearranar trabajos suspendidos, dejarlos en segundo plano, matarlos, et. Ctrl C Ctrl Z Pulsando esta ombinaion de telas uando tenemos un programa orriendo en primer plano, le mandaremos una se~nal que "lo matara". El programa en primer plano quedara suspendido y volveremos a ver el prompt del shell. § ¤ ¦ ¥ jobs Este mandato interno nos informa de los trabajos en urso y de su estado. Podremos referirnos a uno onreto por la posiion que oupa en esta lista. § ¤ ¦ ¥ § ¤ fg Ejeutandolo, el ultimo proeso suspendido volvera a primer plano. Para referirnos § ¤ . al segundo trabajo de la lista de trabajos usaremos ¦fg %2 ¥ bg Ejeutandolo, el u ltimo proeso suspendido volvera a ejeutar, pero en segundo ¦ ¥ plano! Es omo si lo hubieramos arranado on un & detras. 19 T 2.22 £ nal a un proeso, on lo que, normal¢kill ¡ Este mandato interno permite enviarle una se~ p T 2.23 p T 2.24 ? T 2.25 mente, lo mataremos. § ¤ Arranque varios proesos en bakground, por ejemplo varios ¦sleep 60 & ¥ , ya ontinuaion onsulte los trabajos ativos. £ Arranque un proeso en primer plano, por ejemplo ¢at ¡ y suspendalo. Consulte los trabajos ativos. Vuelva a ponerlo en primer plano y luego mandele una se~nal que lo mate. >Como lo matara si se enuentra en segundo plano? Completar nombres de hero Si tenemos un nombre de hero esrito \a medias" y pulsamos el tabulador (7!), el tsh intentara ompletar diho nombre. Si lo que pulsamos es la ombinaion Ctrl D , nos mostrara la lista de nombres que empiezan omo el. Tambien funiona para nombres de mandato. p T 2.26 £ § Esriba ¢ls .s7! ¡y luego intente ls .s Ctrl ¦ ¤ D , observe la diferenia. ¥ Control de sroll de terminal Denominamos terminal al onjunto pantalla/telado o a la ventana a traves de la ual dialogamos on el shell. Ctrl S Ctrl Q Congela el terminal. No mostrara nada de lo que nuestros programas esriban, ni atendera a lo que teleemos. Si por desuido pulsamos Ctrl S podramos pensar que el sistema se ha quedado olgado, pero no es as. Desongela el terminal. Lo que los programas hubiesen esrito mientras la pantalla estuvo ongelada, as omo lo que hubiesemos teleado, apareera en este momento. El uso omun de la pareja Ctrl S Ctrl Q es para ontrolar la salida de programas que emiten muhas lneas. ¤ § T 2.27 Ctrl ¦ S Ctrl ª § T 2.29 ¨ Q © Vera omo el mandato que teleamos aparee y se ejeuta on normalidad. ¤ ls -laR / ¥ ¦ El resultado de este mandato son demasiadas lneas de texto. Juegue on Ctrl Q a parar y dejar orrer la pantalla. ¤ § T 2.30 ¥ Observe que, de momento, nada de lo que hemos teleado aparee en el terminal. « T 2.28 ls -la Ctrl ¦ C ¥ Cuando se anse, mate el trabajo. 20 Ctrl S 2.7 Algunos mandatos utiles less [files...℄ On Sreen File Browser Filtro para la visualizaion por pantalla de heros. Es una version mejorada del lasio mandato more. Si lo usamos indiando un onjunto de heros, podremos pasar al siguiente y al anterior on :n y :p respetivamente. Con este mandato solo podremos ver los heros, pero no modiarlos, mas adelante veremos algun editor. £ ¢less £ ¢ls * fiheros ¡ Visualie el ontenido de los heros que existen ya en su HOME que terminan por \ heros". T 2.31 *¡ T 2.32 Observe que el metaarater * no alude a los heros uyo nombre empieza por punto. passwd Change User Password UNIX protege el aeso a las uentas de los usuarios mediante una palabra lave. Las uentas del sistema, sus ontrase~nas y resto de informaion, estan registradas en el hero /et/passwd. § ¤ ¦ ¥ less /et/passwd Visualie el ontenido del hero de ontrase~nas. Este hero ontiene la informaion sobre las uentas de usuario que hay en su sistema. Compruebe que existe una uenta on su nombre de usuario. § man 5 passwd ¦ T 2.33 ¤ T 2.34 ¥ Estudie ual es el ontenido del hero de ontrase~nas. Un usuario puede ambiar su palabra lave haiendo uso del mandato passwd. Es muy importante que la ontrase~na no sea trivial, ni una feha, ni una matrula de ohe, telefono, nombre propio, et. § passwd ¦ ¤ T 2.35 ¥ <Si no tiene un buen password, ambielo ahora mismo! p orig dest Copy Files Obtiene una opia de un hero o bien opia un onjunto de heros al diretorio indiado. Admite variedad de opiones, que no vamos a desribir en este doumento (si tiene dudas, onsulte el manual). Interesa destaar que este es un mandato peligroso, dado que (por defeto) hae lo que le pedimos sin onsultar, lo ual puede suponer que mahaquemos heros que ya existan. Para que nos onsulte deberemos usarlo on la opion -i. 21 § p /et/passwd ~ ¦ T 2.37 Copie en su !! p T 2.38 T 2.39 ? p T 2.40 ¤ T 2.36 ¥ HOME el hero /et/passwd. Visualie que su ontenido es realmente una opia del original. Copie el hero .shr sobre el que ahora tiene en su uenta on el nombre passwd. >Le ha onsultado p antes de reesribir? >Se ha modiado el hero? Intente las mismas operaiones usando la opion -i. rm files... Remove Files Borrar heros. Para ver sus opiones onsulte el manual. Tambien es un mandato peligroso. En este aso, rm no solo hae lo que le pedimos sin onsultar, sino que en UNIX no existe manera de reuperar un hero (o diretorio) que haya sido borrado. Por lo tanto se hae impresindible usarlo on la opion -i. p T 2.41 p T 2.42 T 2.43 !! p T 2.44 T 2.45 ? § ¤ Intente borrar el hero passwd de su uenta on ¦rm -i passwd ¥ . Conteste que no. Borre el hero passwd que ahora tiene en su uenta. Observe que efetivamente ha sido eliminado. Intente borrar el hero /et/passwd. >Puede haerlo? >Porque? mv orig dest Move (Rename) Files Cambia el nombre de un hero o bien mueve un hero o onjunto de heros a un diretorio. Tambien es un mandato peligroso, porque podra \mahaar" el(os) hero de destino sin pedirnos onrmaion. Se debe usar on la opion -i. p T 2.46 p T 2.47 T 2.48 ? p T 2.49 T 2.50 ? Intente mover el hero /et/passwd a su HOME. Intente mover algun hero de su uenta (uno que no le valga) al diretorio /et. >Puede haer estas operaiones? >Porque? Cambie de nombre al hero mis fiheros a MIS fiheros. >Pudo haerlo? >Le onsulto? 22 mkdir dir Make Diretory Crea un nuevo diretorio. Por supuesto, si ya existe un hero o diretorio on diho nombre dara un error. Los diretorios que usted ree seran suyos. Solo podra rear heros o diretorios en aquellos diretorios donde usted tenga permiso de esritura. p T 2.51 p p £ ¢ls Cree en su uenta un subdiretorio de nombre subarbol. Visualie su ontenido on ls -la. T 2.52 Cree otros subdiretorios mas profundos, pero sin haer uso del d. T 2.53 -laR ~ ¡ Visualie el ontenido atual de su T 2.54 HOME reursivamente. rmdir dir Remove Diretory Borra un diretorio. Por supuesto el diretorio debe estar vao. p ? p p Intente borrar un diretorio no vao, Ej. subarbol. T 2.55 >Puede haerlo? T 2.56 Visualie el ontenido de subarbol. T 2.57 Elimine los diretorios mas profundos, y vaya asendiendo, hasta onseguir eliminar el diretorio subarbol. 2.8 Conguraion Cada usuario puede ongurar el omportamiento de su uenta editando onvenientemente iertos heros presentes en su HOME que dependen de que shell use usted. El hero de onguraion que es de nuestro interes en este momento es: .bashr Se ejeuta siempre que el usuario arrana un nuevo bash. .shr Se ejeuta siempre que el usuario arrana un nuevo sh o tsh. Dado que estos heros solo se leen al arranar el shell, para que los ambios que hagamos en ellos tengan efeto, deberemos bien salir de la uenta y volver a entrar o bien haer uso del mandato interno soure para que su shell lea e interprete el ontenido del hero. Mandatos peligrosos En UNIX, si se borra un hero o un diretorio no hay forma de reuperarlo. Ademas, los mandatos obedeen iegamente a quien los usa, y no onsultan. Para evitar meter la pata es onveniente usar iertos mandatos de forma que onsulten antes de atuar. Para ello, vamos a usar el mandato interno alias, para protegernos de los mandatos problematios. 23 T 2.58 Fin de datos Evitaremos que el shell termine a la pulsaion £ T 2.59 pidiendole que lo ignore. Ejeutando este mandato observara que alias estan en funionamiento. Los alias modian \al vuelo" los mandatos que queremos ejeutar, justo antes de ser nalmente ejeutados. pio file ¦ ¤ ¥ Es un editor de uso muy senillo. Uselo para realizar la siguiente modiaion en el hero de onguraion de su shell. Esoja entre la version de la izquierda, si usted usa el tsh o el sh, o la de la dereha si usa el bash. A~nada al nal del hero de onguraion indiado las siguientes lneas: .bashr .shr alias p 'p -i' alias mv 'mv -i' alias rm 'rm -i' set ignoreeof T 2.61 D ¢alias ¡ § T 2.60 Ctrl alias p='p -i' alias mv='mv -i' alias rm='rm -i' IGNOREEOF=10 £ ¢soure ¡ Reuerde que debe pedirle a su shell que lea e interprete el ontenido del hero de onguraion, para que tenga onstania de la modiaion que aaba de haer. £ T 2.62 T 2.63 ¢alias ¡ Observara si los alias que ha estableido estan en funionamiento. Ctrl D Compruebe si esta seuenia hae terminar su shell. 24 2.9 Explorando el mandato ln Con este mandato podremos rear \enlaes", esto es, rear otros nombres que se reeran a un hero ( o diretorio) ya existente. £ ¢ln £ ¢ln £ ¢ls ... ¡ Cree un enlae fsio (hard link) del hero /et/passwd en su uenta. -s ... ¡ T 2.65 Cree un enlae simbolio (symboli link) del hero /et/passwd en su uenta. -l ¡ T 2.66 Observe los atributos (permisos, propietario, numero de enlaes, et.) de los enlaes que aaba de rear. !! £ ¢rm T 2.64 >Tiene usted permiso para esribir sobre dihos enlaes? Intente esribir en ellos, por ejemplo redirigiendo sobre ellos la salida de otro mandato. ... ¡ Ahora borre los enlaes que reo. >Puede haerlo? >Como es posible? De una expliaion razonable. T 2.67 T 2.68 2.10 Explorando el mandato find Explore en profundidad las opiones de este mandato. Para ello onsulte el manual y realie los siguientes ejeriios. £ ¢find ... -name ... ¡ £ ¢find £ ¢find £ ¢find £ ¢find § ... -ls ¡ T 2.70 Repita la operaion anterior, pero ahora obtenga un listado que detalle los atributos de los heros enontrados. ... -mtime ... ¡ Loalie todos los heros del sistema que han sido modiados en los 3 ultimos das. Guarde el resultado en un hero de nombre signiativo. T 2.71 ... -user ... ¡ T 2.72 Loalie todos los heros del sistema que le perteneen. Guarde el resultado en un hero de nombre signiativo. ... -and ... ¡ Loalie todos los heros del sistema que han sido modiados en los 3 ultimos das y le perteneen. Guarde el resultado en un hero de nombre signiativo. find ... -type ¦ T 2.69 Loalie todos los heros del sistema uyo nombre termina en sh. Guarde el resultado en un hero de nombre signiativo. NOTA: use omillas simples para evitar la expansion de los metaarateres. T 2.73 ¤ T 2.74 ¥ Loalie todos los heros del sistema que no son hero ni diretorio ni hero espeial (orientados a arater o a bloque). Guarde el resultado en un hero de nombre signiativo. 25 2.11 Explorando el mandato sort Explore en profundidad las opiones de este mandato. Para ello onsulte el manual y realie los siguientes ejeriios. £ T 2.75 ¢ls -lRa ¡ T 2.76 ¢sort Obtenga un listado detallado de todos los heros de su uenta. Guarde el resultado en un hero de nombre MIOS. £ £ T 2.77 ¢sort £ T 2.78 ¢ls Ordene las lneas del hero MIOS, alfabetiamente. ... ¡ Ordene las lneas del hero MIOS, por tama~no del hero, de memor a mayor. -S ... ¡ £ T 2.79 ... ¡ ¢sort Intente obtener el mismo resultado usando diretamente el mandato ls. ... ¡ Ordene las lneas del hero MIOS, por feha del hero, del mas antiguo al mas moderno. 2.12 Explorando seuenias de mandatos ¤ § T 2.80 sort ... | head ... ¥ ¦ Combine el mandato anterior on el mandato head en una seuenia para quedarnos solo on las 4 primeras lneas. ¤ § T 2.81 sort ... | tail ... ¥ ¦ p T 2.82 p T 2.83 p T 2.84 Combine el mandato anterior on el mandato tail en una seuenia para quedarnos solo on las 4 ultimas lneas. Combine los mandatos find, sort y head para omponer una seuenia de mandatos uyo resultado sea un listado que detalle los atributos de los 10 heros (no diretorios) del sistema on mayor numero de enlaes. De forma similar, y ombinando tambien el mandato ut omponga una seuenia de mandatos uyo resultado sea solo en nombre de los 10 heros de tama~no mayor en el sistema, uno por lnea. De forma similar, omponga una seuenia de mandatos uyo resultado sea solo en nombre de los 10 heros de mas antguos del sistema. 26 Cap tulo 3 Programai on de Sripts En este apartado usaremos el Bourne Shell para programar heros de mandatos (sripts), pero en oasiones, para probar un mandato omplejo o un sript senillo, lo usaremos de forma interativa. Simplemente ejeutaremos el mandato sh y este nos devolvera el arater $ que es prompt araterstio del sh. Para salir de nuevo al sh pulsaremos Ctrl-D o bien usaremos el mandato interno exit. Ejemplo userhostname> userhostname> ps PID TTY STAT TIME COMMAND 1154 p1 S 0:02 -sh 2556 p1 R 0:00 ps userhostname> eho Mi PID es $$ Mi PID es 1154 userhostname> date Thu Jul 30 18:20:37 CEST 1998 userhostname> who am i hostname.domain!user ttyp1 Jul 30 11:23 (:0.0) userhostname> sh $ $ ps PID TTY STAT TIME COMMAND 1154 p1 S 0:02 -sh 2561 p1 S 0:00 sh 2562 p1 R 0:00 ps $ eho $$ 2561 $ ^D userhostname> 27 3.1 Comentarios Tanto el programa en su onjunto omo ada una de sus partes o funiones deben estar bien doumentados, a base de omentarios que lariquen que hae y omo lo hae. Los omentarios son ualquier texto, omenzando on el arater almohadilla (#) y terminando al nal de la lnea. Esto se ejeuta. # Esto no. 3.2 Variables y Entorno El shell proporiona variables uyo valor son tiras de arateres. El nombre de una variable podra ontener letras, dgitos y el arater ' ', pero no puede empezar por ' '. Las minusulas y las mayusulas se onsideran distintas. Para dar valor a una variable esribiremos variable=valor , sin espaios en blano! Para obtener el valor de una variable usaremos la notaion $variable o $fvariableg si a ontinuaion del nombre de la variable viene letra o dgito. El entorno es un subonjunto de las variables del shell que son heredadas por todo proeso derivado de este. Una variable puede ser a~nadida al onjunto de variables de entorno on el mandato export variable . Las variables de entorno pueden ser visualizadas on el mandato env. Ejeriio 3.1. Esriba el mandato identidad on el siguiente ontenido y ejeutelo: #! /bin/sh # identidad # Identifia al usuario usando las variables de entorno. eho Usted es el usuario \"$USER\". Como podra observar el sh lee, interpreta y ejeuta el ontenido del hero. Este peque~no programa hae uso ademas de la variable de entorno USER. Ejeriio 3.2. Ample el programa anterior para que visualie una desripion ompleta del usuario y la maquina basandose en la informaion ontenida en el entorno. 3.2.1 Variable PATH Cuando le pedimos al shell que ejeute un mandato, lo intentara enontrar entre sus mandatos internos y entre las funiones que tengamos denidas. Si no se enuentra, lo busara en el onjunto de diretorios indiados en la variable de entorno PATH y solo en ellos. Dado que un sript puede fallarle a alguna persona si tiene un PATH diferente o inompleto, se reomienda inluir en una orreta espeiaion de esta variable de entorno. PATH=/usr/bin:/bin Ejeriio 3.3. Experimente on el siguiente mandato en PATH: 28 #!/bin/sh -x # en_PATH # Experimento sobre la variable PATH. # El valor de esta variable afeta a la # loalizaion de los mandatos que usamos. PATH=""; ls # No se enuentra. PATH=""; /bin/ls # SI se enuentra. PATH=/bin; ls # SI se enuentra. Observe que la opion -x del shell permite "depurar"nuestro programa. 3.2.2 Variables espeiales La denominadas variables espeiales, no perteneen al entorno. Es el shell quien les da valor. $0 Nombre del sript. $9 Parametro del sript o funion en la posiion indiada (1 a 9). $# Numero de parametros posiionales o argumentos. $* Lista de argumentos. $ Lista de argumentos. Pero "$" no es una tira de arateres, sino opia exata de la lista de argumentos $$ Identiador del propio proeso shell. $? Valor devuelto por el u ltimo mandato ejeutado. $! Identiador del ultimo proeso lanzado en segundo plano. Ejeriio 3.4. Codique el siguiente mandato argumentos que visualiza el valor de todas las variables espeiales relativas a los argumentos. Experimente la diferenia entre "$", $, "$*" y $*. #! /bin/sh # argumentos args... # Experimento sobre variables espeiales relativas a argumentos. eho '"$"' vale "$", y si lo reorro obtengo: for ARG in "$"; do eho __${ARG}__; done eho '$' vale $, y si lo reorro obtengo: for ARG in $; do eho __${ARG}__; done eho '"$*"' vale "$*", y si lo reorro obtengo: 29 for ARG in "$*"; do eho __${ARG}__; done eho '$*' vale $*, y si lo reorro obtengo: for ARG in $*; do eho __${ARG}__; done Ejeutelo on los siguientes argumentos. argumentos 1 "Dos 2" "3 III" 'Cuatro ****' Conteste >Donde y uando se expanden los omodines de 'Cuatro ****'? Conteste >Porque es preisa la notaion $fARGg? Ejeriio 3.5. El mandato interno shift desplaza los parametros posiionales un lugar a la izquierda, perdiendose el antiguo valor de $1, que pasara a valer lo que vala $2, et. y derementa $#. A~nada al nal del mandato argumentos un ultimo reorrido del siguiente modo: eho Y si voy desplazando los parametros on "shift" obtengo: while [ $# -ne 0 ℄ # Equivalente a... until test $# -eq 0 do eho __${1}__ shift done 3.3 El mandato test Es uno de los mandatos mas usados en shell sripts, estudielo en profundidad puede serle muy util man test . Puede ser un mandato interno del shell o ser un mandato externo. ls -l /usr/bin/[ /usr/bin/test Puede usarse de dos maneras: test expression o [ expression ℄ . Observe que sus argumentos (as omo el arater ℄) deben estar onvenientemente separados por espaios. Un buen shell sript debe veriar que los argumentos on los que ha sido invoado (si es preiso alguno) son orretos, y si no lo son debe indiarle al usuario la forma orreta de utilizaion. Para veriar el numero de argumentos usaremos el mandato test. Ejeriio 3.6. Ample el siguiente mandato test test para que realie todos los posibles test de uno o dos argumentos. #!/bin/sh # test_test arg1 [arg2℄ # Usa el mandato test(1) de todas las formas posibles # sobre 1 o 2 argumentos. 30 test_as_file() { for opt in b d e f g do test -$opt "$1" && : TRUE || : false done } if [ $# -eq 2 ℄ then set -x # Ativamos el modo depuraion. test_as_file "$1" test_as_file "$2" ... elif [ $# -eq 1 ℄ then ... else ... fi Ejeutelo on. . . "" , /dev/onsole , . , 2 02 , "1 -lt 3" , et. Conteste >$1 hae referenia al mismo parametro uando se usa en el programa prinipal que uando se usa dentro de una funion? Conteste >Porque es preisa la notaion entreomillada "$1"? Conteste >Que signia la notaion mandato && mandato || mandato ? Conteste : es un mandato interno. >Para que sirve? (man sh y busque :). Conteste set es un mandato interno. >Para que sirve? 3.4 Funiones Usando el Bourne Shell podemos haer uso de grupos de mandatos, agrupados entre llaves 'fg' all donde podramos haber usado un mandato simple. Las funiones en Bourne Shell son simplemente el resultado de ponerle un nombre unio a un onjunto de mandatos agrupados mediante llaves. Son una de las araterstias mas poderosas del sh y es neesario aostumbrarse a usarlas. funtion() { # Conjunto de mandatos # que implementan la funion return 0 # terminaion orreta } En una funi on los parametros posiionales $1, $2, et. son los argumentos de la funion (no los argumentos del sript). 31 Una funi on puede ser usada de igual modo que se puede usar un mandato externo. Una funi on devolvera su propio estado de terminaion usando la sentenia return. Si se usa exit dentro de una funion, se estara terminando el sript ompleto, no solo la funion. return 0 # Terminaion orreta Las funiones son ideales para enapsular una determinada labor. Se pueden redirigir su entrada, salida o error, onetarlas por pipes, et. Las funiones del Bourne Shell pueden ser reursivas! Ejeriio 3.7. Esriba el mandato arbol que reiba omo argumentos una lista de heros y/o diretorios e imprima los nombres ompletos de ada hero y reorra ada diretorio de forma reursiva en profundidad. El resultado debe ser un nombre ompleto de hero por lnea, onvenientemente endentado (on tabuladores) para indiar la profundidad de la reursion. Utilie una funi on reursiva de nombre sub arbol que reiba omo primer argumento una tira de tabuladores, omo segundo el nombre del diretorio que se esta explorando en este momento y a ontinuaion ualquier numero de nombres de hero o diretorio a evaluar. Para obtener el ontenido de un diretorio utilie `ls -A1 $DIR`. 3.5 Entrada, salida y error estandar La entrada, salida y error estandar son los desriptores de hero 0, 1 y 2. Cada uno tiene una mision onreta y deben ser usados onvenientemente. Error Los mensajes de error deben apareer en el estandar error y no en la salida estandar. eho Fihero de onfiguraion inexistente. >&2 A vees, por estetia, interesara sileniar posibles mensajes de error generados por los mandatos que usamos. Lo onseguiremos dirigiendo la salida de error de diho mandato a /dev/null. expr $NUM 2> /dev/null || reintentar Salida La salida estandar es para los mensajes que van dirigidos al usuario o a otros proesos. eho -n "Desea rearlo?[s℄ " Entrada La entrada estandar es para reoger la respuesta de los usuarios o la salida de otros proesos. read RESPUESTA CWD=`pwd` 32 Interativo Es posible que la entrada estandar no este asoiada al terminal (haya sido redirigida) y no haya un usuario al ual onsultar. Si es preiso nuestros programas pueden tener esto en uenta y omportarse de forma distinta segun esten siendo usados de forma interativa o no tty -s . in-situ Podemos inorporar en nuestro propio sript el texto que queremos que sea la entrada a un mandato. at << 'Fin ayuda' Las lneas de texto siguientes, hasta una que literalmente ree Fin ayuda seran la entrada al mandato. Si la mara de "n de doumento in-situ"presenta algun quoting el texto sera literal, si no seran expandidas las variables y los mandatos entre omillas inversas. Ejeriio 3.8. Esriba el mandato reto que retara al usuario a que adivine un numero (por ejemplo el PID del proeso). Para ello leera los valores numerios que el usuario telee y respondera indiando si el numero sereto es mayor, menor o igual, en uyo aso terminara. Para omparar los valores numerios haga uso del mandato test. El programa s olo debe admitir ser usado de forma interativa. El programa debe llamar al usuario por su nombre haiendo uso de la variable USER. Debe evitar morir si el usuario le manda una se~ nal desde telado. Para ello apturara las se~nales SIGINT y SIGQUIT (man 7 signal) haiendo uso del mandato interno trap. Si el usuario responde al reto on Ctrl-D (n de datos), el programa pedir a una onrmaion positiva antes de terminar. 3.6 Manipulaion de tiras de arateres Internamente el shell ofree poos meanismos para manipular tiras de arateres, si bien siempre se puede haer uso de mandatos externos apaes de manipular heros de texto de forma sostiada. ase La sentenia ase permite loalizar patrones senillos en tiras de arateres. Se usa por ejemplo para analizar los parametros de entrada de los shell sripts y reonoer opiones. ase $1 in 0) eho Cero ;; 1|2|3|4) eho Positivo ;; -[1234℄) eho Negativo ;; *.*) eho Deimal ;; *) eho Otra osa ;; esa 33 read El mandato interno read lee una lnea de su entrada estandar y asigna valor a las variables que se le pasan omo argumentos. La lnea se divide por los arateres que se onsideran separadores de ampo que normalmente son el tabulador y el espaio. set El mandato interno set. Si le pasamos una lista de argumentos, los separa por los arateres que se onsideran separadores de ampo y los asigna omo valores a los parametros posiionales $1, $2, et. y atualiza $#. Ademas, el mandato set sirve para ativar opiones del propio shell, omo el modo depuraion, modo verbose, et. Consulte el manual. IFS El onjunto de arateres que el shell onsidera separadores de ampo son los que ontiene la variable de entorno IFS (Input Field Separator). Cambiando el valor de esta variable podemos dividir lneas por los arateres que queramos. IFS=':' read field 1 field 2 rest < file IFS=', ' set "1,2,3,4 5.6" Observe en el ejemplo anterior la forma de asignar valor a una variable en la misma lnea en la que se invoa al mandato, sin separarlos por ;. Usando esta sintaxis la modiaion del valor de la variable solo afeta a diha invoaion, y no es permanente. Ejeriio 3.9. Doumente adeuadamente el siguiente odigo. Para ello, onsulte el manual hasta entender omo se onsigue el valor adeuado en ada aso. #!/bin/sh -x # hora # Experimento manipulaion de tiras de arateres. TIME=`date | ut -12-19` TIME=`date | ut -d\ -f4` TIME=`date | sed 's/.* .* .* \(.*\) .* .*/\1/'` TIME=`date | awk '{print $4}'` TIME=`set \`date\`; eho $4` TIME=`date | (read u v w x y z; eho $x)` TIME=`date +%T` Ejeriio 3.10. Esriba el mandato adivina que tendra que intentar adivinar el valor de un parametro numerio que solo el usuario onoe, preguntandole osas que solo debe responder on si o no. El programa s olo debe admitir ser usado de forma interativa. El programa debe presentar un men u de los oneptos que sabe adivinar (edad, altura, et.) y leer la opion que el usuario seleione. Para identiar la opion utilie la sentenia ase. 34 Esriba la funi on auxiliar pregunta si que reiba omo argumentos el texto de una pregunta, se lo presente al usuario, lea su respuesta (usando el mandato interno read) y on un ase ompruebe si la respuesta es armativa. Si lo es terminara bien, sino terminara mal. Esriba la funi on auxiliar diotoma que ontrole dos valores numerios menor y mayor que representan un rango, y pregunte al usuario sobre el valor medio del rango, de forma que se pueda reduir el rango a la mitad. Para alular el valor medio utilie el mandato externo expr. 35