Está en la página 1de 35

Curso de GNU/Linux para principiantes

Margarita Manterola Maximiliano Curia Facultad de Ingenier - UBA a Actualizado Junio 2003

1.

Conociendo GNU/Linux
GNU/Linux es un sistema operativo derivado de UNIX, que se distribuye en forma libre.

1.1.

Qu es UNIX e

UNIX es un sistema operativo multitarea, multiusuario, creado en 1969 por los investigadores Thompson y Ritchie de los Laboratorios Bell, en los Estados Unidos. Las primeras versiones fueron escritas en assembler, pero muy pronto fue re-escrito en lenguaje C. En sus primeros aos, no se lo utiliz comercialmente, sino que se lo usaba para proyectos de n o investigacin en laboratorios y se distribu gratuitamente en las universidades, donde tuvo mucha o a aceptacin. o En 1975, Bell decidi comercializarlo. Dado que el sistema se vend con una licencia que permit o a a modicarlo y redistribuirlo, a lo largo del tiempo fueron surgiendo una gran variedad de sistemas derivados del UNIX original. Los ms conocidos, actualmente, son: Solaris, AIX, HPUX, SCO, BSD. a Por esta razn, varias veces se hizo necesario normalizar estos sistemas, para que cumplan con o determinadas normas (POSIX, UNIX95, etc), para permitir la compatibilidad entre los diferentes sistemas. De estas normas, el sistema operativo GNU/Linux satisface la norma POSIX-1, y casi completamente la POSIX-2.

1.2.

Qu es GNU e

La sigla GNU signica GNU is Not Unix. En 1984, Richard Stallman fund el Proyecto GNU con el objetivo de conseguir un sistema opeo rativo libre y abierto. Esto es, un sistema operativo tal que los usuarios puedan usarlo, leer el cdigo o fuente, modicarlo, y redistribuirlo. A partir de ese momento, un gran nmero de colaboradores se fueron sumando al proyecto, desau rrollando software libre para reemplazar cada una de las herramientas del sistema UNIX. La losof GNU apoya el crecimiento de la sociedad como un conjunto, haciendo especial hincaa pi en la valoracin de las libertades personales, an cuando esto puede estar en conicto con intereses e o u empresariales.

1.3.

Qu es Linux e

En 1991, Linus Torvalds complet el sistema con su kernel (que es la aplicacin encargada de o o comunicar los procesos con el hardware de la computadora). A este kernel lo bautiz Linux. o De esta manera, se form el sistema GNU/Linux. o 1

1.4.

Qu es BSD e

La Universidad de Berkeley estuvo relacionada con el desarrollo de los sistemas operativos UNIX. Recibio de AT&T una version gratuita de UNIX, y a partir de entonces comenzo a promover el desarrollo de aplicaciones para UNIX dentro de la universidad. Mas adelante, desarrollo su propio sistema operativo UNIX, sin utilizar el cdigo fuente de AT&T. o El kernel fue creado desde Berkeley, pero las herramientas utilizadas son en su mayoria GNU, es decir las mismas que en el sistema GNU/Linux. Existen actualmente 3 sistemas operativos libres, derivado de BSD: FreeBSD, OpenBSD y NetBSD.

1.5.
X.

Qu es X e

El sistema operativo GNU/Linux cuenta con una interfaz grca, llamada XFree86 o simplemente a El protocolo X fue desarrollado por el MIT, principalmente como un logro acadmico para proe porcionar un entorno grco a UNIX. La licencia mediante la cual se distribuye permite usarlo, a modicarlo, redistribuirlo e incluso relicenciarlo.

1.6.

Qu son las distribuciones e

El cdigo fuente del sistema GNU y del kernel Linux est accesible a todo el mundo, sin embargo, o a hacer funcionar un sistema a partir del cdigo fuente es bastante dif Por eso, un sistema operativo o cil. se distribuye (normalmente) en formato binario, es decir ya compilado. Poco despus de que apareciera el kernel Linux, comenzaron a aparecer las primeras distribucioe nes, que agrupaban versiones probadas de varios programas, junto con el kernel, de tal manera que formaban un sistema operativo listo para usar. A medida que fue pasando el tiempo, algunas distribuciones se fueron haciendo ms sosticadas, a otras desaparecieron, otras se hicieron comerciales y aparecieron mucha ms. Existen distribuciones a de muchos tipos: distribuciones que ocupan 1 diskette y distribuciones que llegan a ocupar 10 CDs; distribuciones orientadas a una nalidad en especial (redes, seguridad, etc) y distribuciones de uso general. Cada usuario de GNU/Linux suele elegir la distribucin con la que se siente ms cmodo, y no o a o tiene sentido entrar en discusiones acerca de cul es mejor. a A menos que aclaremos lo contrario, lo que se ensea en este curso es aplicable a la gran mayor n a de los sistemas UNIX, y a cualquiera de las distribuciones de GNU/Linux.

1.7.

Qu son las plataformas e

El mundo de las computadoras no se restringe a las Computadoras Personales con las que estamos en contacto todos los d as. Existen diversas arquitecturas en las que una computadora se puede presentar. A cada una de estas arquitecturas la llamamos plataforma. Ejemplos de algunas plataformas posibles son: iMac (de Macintosh), Sparc (de Sun), S/390 (de IBM), PlayStation (de Sony), XBox (de Microsoft). En particular, la plataforma que utilizamos comunmente se la denomina i386, ya que est basada a en los procesadores de Intel, a partir del 386.

1.8.

Por qu aprender acerca de GNU/Linux e

Actualmente, a partir de la popularizacin de Internet, ha crecido en gran medida la cantidad de o servidores de red en todo el mundo. Estos servidores deben contar con un sistema conable, que pueda 2

ofrecer los servicios de correo, web, etc. Por eso es que la gran mayor de estos servidores utilizan a algn derivado de UNIX como sistema operativo. u Dado que el sistema GNU/Linux cumple muy bien con estas caracter sticas, con el adicional de que se puede obtener completamente gratis, ao a ao ha crecido el nmero de servidores que lo n n u utilizan. En el caso de las computadoras personales, a partir de la aparicin de ms y ms aplicaciones o a a grcas, de uso general en el sistema GNU/Linux, se ha hecho posible la utilizacin de este sistema a o para computadoras de escritorio. La gran cantidad de software desarrollado en todo el mundo, permite tener muy buena compatibilidad con otras computadoras, y tener disponibles -al mismo tiempo- las herramientas UNIX.

1.9.

Software Libre

A lo largo de todo este curso, siempre utilizamos Sofware Libre. Por lo general, este software lo hemos obtenido gratuitamente, sin embargo, debemos entender que el hecho de que el software sea libre est relacionado con la libertad que nos otorga a los usuarios de utilizarlo, modicarlo y a distribu rlo, no con el precio al cual lo podemos obtener. Al hablar de software libre se suelen clasicar los distintos grados de libertad a los que podemos tener acceso los usuarios. Libertad Grado 0 El software se puede usar. Es la libertad que nos otorga casi cualquier software. Libertad Grado 1 El software se puede modicar. Es decir, se puede personalizar, mejorar, adaptar para las necesidades particulares de un determinado usuario. Libertad Grado 2 El software se puede distribuir. Es decir, se puede copiar, vender, prestar o compartir a las personas que el usuario desee, sin tener que pedir permiso al autor del software. Libertad Grado 3 El software se puede distribuir modicado. Se trata de una suma de la 1 y la 2. Permite que las mejoras que un usuario le haya hecho a un determinado software puedan compartirse con otros usuarios. Para poder considerar que una determinada aplicacin cumple con los requisitos de software libre o es necesario que estn dadas estas cuatro libertades para cualquier usuario. e En particular para poder tener la libertad de modicar el software, es necesario tener acceso al cdigo fuente del programa en cuestin, y no solamente al cdigo binario (llamamos cdigo binario a o o o o aqul que es entendido por la computadora) ya que para poder modicar correctamente el software e es necesario poder acceder al cdigo fuente original. o Estas ideas de software libre como las conocemos hoy fueron desarrolladas y trabajadas durante mucho tiempo por Richard Stallman y sus seguidores, miembros de la Free Software Fundation(Fundacin del Software Libre). o En general las ideas del software libre buscan promover la generacin de mejor software (a travs o e de la suma de los pequeos aportes de cada persona), y colaborar para que toda la sociedad se vea n beneciada con los avances del software. Es decir, logramos mejorar la sociedad al tener disponibles ms y mejores herramientas. a Para ms informacin sobre el software libre pueden visitar el sitio de internet del Proyecto GNU a o (http://www.gnu.org), que tiene una gran cantidad de documentos relacionados con la losof del a software libre.

2.
2.1.

Conceptos Generales
Modo Grco - Modo Consola a

Como ya dijimos anteriormente, GNU/Linux puede utilizar el Modo Grco, si utiliza la aplicacin a o XFree86. Por otro lado, llamamos Modo Consola, al modo que es puramente texto. Gran cantidad de los temas que se ensean en este curso se pueden probar en modo consola, o bien en una consola grca, n a dentro del modo grco. a

2.2.

Comenzando la sesin o

Dado que UNIX es un sistema multiusuario, para poder comenzar a utilizarlo debemos ingresar el usuario y password que nos identica. Esto lo podemos hacer tanto en modo grco como en modo a consola. Muchas veces, cuando ingresemos nuestra contrasea a un sistema UNIX, no veremos los caracn teres (ni siquiera un *). Esto se debe a que de esta manera es ms dif que un observador sepa la a cil cantidad de caracteres que contiene nuestra contrasea. n Una vez que hayamos ingresado, tendremos acceso a nuestros archivos, y podremos ejecutar una gran cantidad de aplicaciones, segn los permisos que se le hayan dado a nuestro usuario. u Es decir que, cada usuario que utilice el sistema tendr un tratamiento distinto. A esto nos refea rimos cuando decimos que todo sistema derivado de UNIX es multiusuario. En particular, existe un usuario que es el encargado de administrar el sistema, es el usuario que tiene acceso a los archivos de conguracin, a instalar y desinstalar el sistema. Este usuario suele o tener el nombre de root, o tambin superusuario. e

2.3.

Permisos y propiedad

En GNU/Linux los permisos sobre los programas y los archivos del sistema son bastante ms a espec cos que en sistemas como Windows. Existen los conceptos de propiedad y permisos. Propiedad: los usuarios son propietarios de archivos. Todos los archivos que un usuario crea son su propiedad. Permisos: se reere a lo que un usuario puede hacer con un determinado archivo, sea o no el dueo n de ese archivo. Mediante los permisos, se controla quin puede visualizar, editar o ejecutar archivos e en el sistema.

2.4.

Consolas virtuales

En GNU/Linux y en sistemas UNIX modernos en general, es normal que nuestra computadora funcione como muchas terminales a un mismo tiempo. En un sistema UNIX tradicional, por otro lado, cada estacin de trabajo nos dar acceso a una unica terminal del sistema. o a A esta caracter stica que nos permite tener varias terminales en una sola computadora, la llamamos consolas virtuales. Para cambiar de una terminal a otra, normalmente se utiliza la combinacin de teclas Alt-F1, o Alt-F2, etc. O bien, Ctrl-Alt-F1, Ctrl-Alt-F2, etc. Dentro de una consola podemos movernos hacia arriba o hacia abajo, utilizando la combinacin o de teclas Shift-PgUp y Shift-PgDn.

2.5.

Apagado del sistema

Como en otros sistemas operativos, es importante ejecutar un comando que cierre todas aquellas aplicaciones que estn corriendo, antes de apagar el sistema. En caso contrario, al reiniciar el sistema e operativo se efectuar una vericacin del disco r a o gido. A diferencia de otros sistemas operativos, los sistemas UNIX estn pensados para permanecer a encendidos constantemente, esto hace que los usuarios comunes (los que no son el superusuario) no puedan apagar el sistema en forma remota. En consecuencia, cuando solamente tenemos acceso de nivel usuario a una computadora con un sistema UNIX, la unica manera de apagarla en forma segura es haciendo Ctrl-Alt-Del desde modo consola. Una vez presionada esta combinacin de teclas, todos los procesos que se estn ejecutando o e sern detenidos, y la computadora se reiniciar. a a En cambio, si furamos el superusuario del sistema, podremos ejecutar los comandos halt o reboot e para apagar o reiniciar el sistema, respectivamente.

3.

Recorrido por el sistema

Vamos a ver algunos comandos bsicos de todo UNIX, que nos permitirn familiarizarnos con el a a sistema. Para poder utilizar estos comandos ya debemos haber iniciado la sesin. o Cuando hemos iniciado la sesin estaremos delante de un prompt (solicitud), que es la l o nea de comandos de UNIX. El formato de este prompt ser similar a: user@anteojito:~$. a La mayor de estos comandos son herramientas simples, que realizan una sola tarea. Ms adelante a a aprenderemos como combinar lo que hacen dos o ms herramientas para lograr un resultado ms a a interesante. Algunos de estos comandos pueden recibir opciones o parmetros, que pueden hacerlos realizar a tareas diferentes. En UNIX, casi todas las opciones que reciba un comando estarn precedidas por el a caracter -, y pueden combinarse segn sea necesario. u Es importante notar que UNIX es sensible a las maysculas y minsculas (case sensitive), de forma u u que si queremos obtener la salida correcta es necesario escribir los comandos que aqu se explican tal cual se presentan (casi siempre en minsculas). u

3.1.
3.1.1.

Comandos Sencillos
date

Ejecutando el comando date obtendremos la fecha y la hora actual. Tambin es el comando que e se usa para cambiar la fecha de la mquina. a 3.1.2. who

El comando who nos permite ver los usuarios que estn utilizando el sistema, incluyendo la fecha a en la que se conectaron al sistema. Adems, una versin alternativa (who am i) nos muestra unicamente nuestra conexin. a o o 3.1.3. uptime

Podemos ver cunto tiempo hace que se ha iniciado el sistema de nuestra computadora ejecutando a el comando uptime. Tambin obtendremos alguna informacin adicional, como la cantidad de usuarios e o que estn utilizando el sistema, o la carga promedio que tiene el procesador. a 5

3.1.4.

clear

El comando clear sirve para limpiar la pantalla. Es equivalente al cls de DOS. 3.1.5. echo

echo es un comando muy sencillo. Lo que hace es repetir todo lo que recibe por l nea de comandos. Si ejecutamos: echo Hola obtendremos la salida Hola. A pesar de parecer intil, este comando nos ser de bastante utilidad cuando aprendamos ms u a a sobre el intrprete de comandos del sistema. e

3.2.
3.2.1.

Comandos relacionados con archivos y directorios


pwd

El comando pwd es muy sencillo, nos muestra la ruta de directorios en la que estamos situados en este momento. Por ejemplo, /home/user. 3.2.2. ls

Para listar los archivos dentro de un determinado directorio utilizaremos el comando ls. El equivalente en DOS es dir. Si ejecutamos ls sin ninguna opcin, nos listar los archivos del directorio actual. Si, en cambio, o a ejecutamos ls directorio, nos listar los archivos de ese directorio. a Puede recibir varias opciones: -l: muestra mucha ms informacion sobre los archivos, como el usuario y el grupo al que a pertenece, el tamao, los permisos, etc. n -a: muestra todos los archivos, incluyendo los ocultos. -t: ordena los archivos por fecha de modicacin. o Estas opciones pueden combinarse, utilizando un solo signo -, por ejemplo: ls -lat. 3.2.3. touch

El comando touch archivo puede tener dos consecuencias: si archivo no existe an, lo crea con u tamao 0 y como propiedad de nuestro usuario. Por otro lado, si archivo ya existe, actualiza la fecha n de modicacin. o 3.2.4. cp

El comando cp es el que se utiliza para copiar archivos. Si escribimos cp viejo nuevo, copiaremos el archivo viejo con el nombre nuevo. Es decir, el archivo origen se escribe primero y a continuacin el archivo que se va a crear. Una vez hecha la o copia, tendremos dos archivos diferentes, con el mismo contenido. Por otro lado, tambin podemos ejecutar cp archivo1 archivo2 directorio, de forma que los e archivos archivo1 y archivo2 se copiarn dentro de directorio. a

3.2.5.

mv

Muy similar a cp, el comando mv es el que se utiliza para mover archivos de un lugar a otro, o para cambiarle el nombre a un archivo. Si ejecutamos, mv viejo nuevo, el archivo viejo habr pasado a a llamarse nuevo. Por otro lado, si ejecutamos mv archivo1 archivo2 directorio, los archivos archivo1 y archivo2 se movern dentro de directorio. a 3.2.6. rm

Para borrar archivos utilizamos el comando rm. Hay que usarlo cuidadosamente, porque una vez que los archivos han sido borrados, no pueden recuperarse de ninguna forma. Si deseamos que rm nos pregunte si queremos borrar o no un archivo, debemos utilizar la opcin -i, o mientras que si deseamos que no nos pregunte utilizamos la opcin -f. Depender de la conguracin o a o del sistema cual de estas dos opciones es la que est seleccionada por omisin. a o 3.2.7. mkdir

Utilizamos el comando mkdir directorio para crear directorios. Pueden utilizarse rutas absolutas o relativas. Es decir que si queremos crear el directorio /home/user/temp, y estamos situados dentro del directorio /home/user, podremos ejecutar mkdir temp o mkdir /home/user/temp indistintamente. 3.2.8. rmdir

Para borrar directorios utilizamos el comando rmdir directorio. Solamente funcionar si el a directorio est vac En caso contrario, habr que borrar primero los archivos, para luego borrar el a o. a directorio. 3.2.9. cd

El comando cd nos permite cambiar de directorio, igual que en DOS. Por ejemplo, cd / nos lleva al directorio ra que es de donde surgen todos los directorios del z, sistema. Para cambiar a otro directorio dentro del arbol, podemos utilizar cd usr, o cd /home/user. Ms a adelante veremos cmo se organiza el rbol de directorios, y qu hay en cada uno. o a e Utilizado sin ningn otro parmetro, cd nos lleva al directorio personal del usuario (home). Otra u a manera de ir al directorio personal es utilizar cd ~, ya que el s mbolo ~ identica al directorio de cada usuario. Para cambiar al directorio padre del directorio actual se utiliza cd .. (no olvidar el espacio). Mientras que para volver al directorio en el que nos encontrbamos antes de ejecutar el ultimo cd, a podemos ejecutar cd -. 3.2.10. le

En UNIX los archivos no se identican por su extensin, como en DOS. Se les puede poner una o extensin, pero es de adorno. o

El comando file nos permite tener una idea del contenido de un archivo. Al ejecutar file archivo, inspecciona partes del archivo para darse cuenta qu clase de archivo es. Puede decirnos que se trata e de un archivo de texto, un directorio, una imagen, etc. 3.2.11. du

El comando du, Disk Usage, nos muestra el espacio que ocupan todos los directorios a partir del directorio actual. El nmero de la primera columna es el espacio ocupado por el directorio y u est expresado en kb. a du -s nos muestra unicamente el total. du -a muestra lo que ocupan los archivos, adems de los directorios. a du -h hace el listado, indicando la unidad (human readable). du archivo nos dice cunto ocupa el archivo. a 3.2.12. nd

El comando find permite encontrar archivos, utilizando diversas tcnicas. En principio, si se le e pasa como parmetro unicamente una determinada ruta, por ejemplo find /home/user, el comando a buscar todos los archivos y directorios que se encuentren a partir de esa ruta. a Utilizando algunos otros parmetros es posible buscar los archivos por diversos criterios. a find . -name "hola.txt" encuentra todos los archivos llamados hola.txt que se encuentren a partir del directorio actual. Las comillas no son obligatorias, pero son recomendables si se quieren usar opciones ms complejas (por ejemplo, utilizando metacaracteres de shell, que se a explican en la seccin 4.1). o find . -size 50k busca los archivos que ocupan 50 kilobytes a partir del directorio actual. Si se utiliza find . -size 20c, buscar los archivos que ocupen 20 bytes. Y si se utiliza a find . -size 5b, buscar los archivos que ocupen 5 bloques de 512 bytes cada uno. a find /home/user -empty busca todos los archivos que se encuentran vac a partir del direcos, torio /home/user. Es posible, adems, utilizar opciones adicionales para la bsqueda, que indiquen la profundidad a u de la bsqueda, que agreguen otros criterios adicionales a los explicados, o que indiquen una accin a u o llevar a cabo una vez encontrados los archivos. 3.2.13. cat

Ejecutando cat archivo podremos ver el contenido de archivo. Este comando puede recibir una serie de archivos, y el resultado ser que nos mostrar un archivo a continuacin del otro. a a o Un caso especial se produce cuando ejecutamos cat sin ningn nombre de archivo. En este caso, el u comando esperar a que nosotros le demos una entrada, y la ir reproduciendo l a a nea por l nea. Hasta que presionemos la combinacin Ctrl-d, que indica que la entrada ha terminado. o

3.2.14.

od

El comando od Octal Dump, nos permite ver byte a byte el contenido de un archivo. La primera columna es la direccin de cada l o nea que vemos. Utilizando las distintas opciones, podemos visualizarlo en varios formatos: od archivo nos muestra el contenido del archivo expresado en nmeros octales, generalmente u tomados de a dos bytes. od -b archivo nos muestra el contenido, en nmeros octales, byte a byte. u od -c archivo nos muestra los caracteres que forman el archivo, uno por uno. od -cb archivo nos muestra los caracteres, y debajo de cada caracter el nmero octal del byte. u od -h archivo nos muestra el contenido, en nmeros hexadecimales, tomados de a dos bytes. u Las nuevas versiones de od soportan muchos ms formatos, utilizando la opcion -t formato. a 3.2.15. wc

El comando wc archivo, se utiliza para contar la cantidad de l neas, palabras y letras que tiene un archivo. 3.2.16. less

El comando less permite paginar la salida de otros comandos, o bien, el contenido de algn u archivo. Si ejecutamos less archivo, veremos la primera pgina del archivo. Si este archivo es lo suciena temente largo, podremos movernos hacia abajo y hacia arriba utilizando PageUp, PageDown, Home, End, Enter, los cursores, la barra espaciadora, etc. Tambin podemos realizar bsquedas dentro del archivo, para ello utilizamos la barra invertida \, e u seguida del patrn que queremos buscar. Por ejemplo, si tipeamos \consola, nos mostrar la primera o a ocurrencia del patrn consola. Para ver la siguiente ocurrencia, utilizamos n, y para ver la ocurrencia o anterior N. Para salir, utilizamos q.

3.3.

Comandos relacionados con procesos

Cada aplicacin que se ejecuta dentro de un sistema UNIX es un proceso. Algunos procesos estn o a ejecutndose sin que nosotros lo sepamos. Otros procesos comienzan a ejecutarse cuando nosotros se a lo indicamos. Cada proceso que se ejecuta dentro de nuestra computadora tiene un nmero que lo identica, u llamado Process ID (PID). Este nmero ser el que deberemos utilizar para referirnos a ese proceso u a con otros comandos. Vemos a continuacin los comandos bsicos para manejar procesos dentro de los sistemas UNIX. o a 3.3.1. top

El comando top nos muestra algunos de los procesos que se estn ejecutando, ordenados por el a tiempo de procesador de la computadora que consumen. Muestra algunos datos adicionales de cada proceso, por ejemplo, en la primera columna, podemos observar el PID de cada uno. Adems, muestra otros datos acerca del uso que se le esta dando a la mquina. a a Para salir: q. 9

3.3.2.

ps

El comando ps nos muestra la lista de procesos que se estn ejecutando en la computadora. En a particular, es interesante ver la salida de ps ax, que nos muestra todos los procesos, tanto los de nuestro usuario como los de otros, e incluso los procesos que no tienen usuario. La primera columna de la salida de ps tambin contiene el PID del proceso. e 3.3.3. Ctrl-z

La combinacin de teclas Ctrl-z sirve para suspender una tarea dentro de su ejecucin. o o Por ejemplo, si estamos ejecutando el proceso top y presionamos Ctrl-z, se suspender la ejecucin a o de top y volveremos a obtener la l nea de comandos. Antes de devolvernos la l nea de comandos, nos indicar cul es el nmero de trabajo del proceso que hemos suspendido. a a u Podemos iniciar varias tareas distintas, y luego suspenderlas. De forma que el nmero de trabajo u de las tareas suspendidas se va incrementando. 3.3.4. bg - fg

El comando bg permite que el proceso que se halle suspendido, contine ejecutndose en background u a (de fondo). Mientras que el comando fg permite que un proceso suspendido pase a foreground (a la pantalla principal). 3.3.5. jobs

Para poder ver qu comandos se estn ejecutando en background y cules han sido suspendidos o e a a terminados, podemos utilizar el comando jobs. La lista que nos muestra este comando incluye el nmero de trabajo, que no es el mismo que u el PID, y podemos utilizar este identicador para decidir cul de las tareas pasar a foreground o a background. Por ejemplo: fg 1 pasa a foreground el trabajo nmero 1. Mientras que bg 3 pasa a background u el trabajo nmero 3. u 3.3.6. kill

Este comando nos sirve para interrumpir la ejecucin de un determinado proceso. El comando o env una seal al proceso por la cual (normalmente) se cierra. a n Podemos ejecutarlo teniendo en cuenta el PID del proceso. Por ejemplo: kill 1234, matar el a proceso 1234. O bien, teniendo en cuenta el nmero de trabajo. En ese caso: kill %2, detendr el u a trabajo nmero 2. u 3.3.7. Ctrl-c

Cuando una aplicacin se est ejecutando en foreground, y deseamos detenerla, podemos utilizar o a la combinacin de teclas Ctrl-c. o El uso de esta combinacin es equivalente a ejecutar el comando kill con el nmero de proceso o u de la aplicacin que estamos utilizando. o

3.4.

Obteniendo ms informacin a o

En GNU/Linux existen much simos documentos de ayuda, manuales y HOWTOs, que estn pena sados para que cualquier persona pueda encontrar informacin sobre lo que est buscando. o a

10

3.4.1.

man

Un comando muy importante es man. Este comando nos mostrar las hojas del manual del proa grama que estamos queriendo buscar. Por ejemplo, man date nos mostrar el manual del comando date, que ya sabemos que sirve para a ver y congurar la fecha, aqu est explicado cmo utilizarlo. a o Podemos movernos dentro de las pginas de los manuales utilizando la barra espaciadora, Enter, a los cursores y el mismo sistema de bsqueda que utilizamos en less. Para salir, utilizamos q. u 3.4.2. info

Un comando muy similar a man, es el comando info. Las pginas que nos muestra este comana do suelen tener una mayor cantidad de informacin acerca de la aplicacin sobre la cual estamos o o consultando. Por ejemplo info sh-utils, contiene informacin detallada sobre algunas de las utilidades del o intrprete de comandos (shell), que se ver ms adelante. e a a 3.4.3. help

Algunos comandos (como fg), son parte interna del intrprete de comandos, y por esta razn no e o tienen una pgina del manual que los explique. a Para saber de qu manera utilizar estos comandos, usamos help. La ayuda que nos da este comando e es ms sinttica que la de man. a e Por ejemplo help jobs, nos informar sobre el uso del comando jobs visto anteriormente. a 3.4.4. Archivos con informacin o

Dentro del directorio /usr/share/doc, encontramos una gran cantidad de documentos que tratan las distintas aplicaciones que tenemos instaladas en nuestro sistema. En particular, el directorio /usr/share/doc/HOWTO, contiene art culos sobre cmo hacer determio nadas cosas dentro de nuestro sistema.

11

4.

Shell

El shell es el intrprete de comandos. En DOS normalmente el shell es el command.com, en UNIX e existen muchos shell usados habitualmente. sh Desde la sptima edicin de UNIX el shell por excelencia es el sh. Fue escrito por Steven Bourne, e o y es por eso que se lo suele llamar Bourne Shell. Est disponible en todas las versiones de UNIX a y es lo sucientemente bsico como para que funcione en todas las plataformas. a csh Un shell un poco mejor con respecto al sh es el csh, que fue escrito por Bill Joy, y debe su nombre al lenguaje de programacin C. Al hacer scripts en este shell puede utilizarse una sintaxis similar o a la de C. ksh Otro shell, que como ventaja maneja un historial de comandos, es el ksh (korn shell). Est basado a en sh, con algunos agregados muy bsicos para hacerlo ms amigable. a a bash Uno de los shell ms avanzados, muy popular en la comunidad GNU/Linux es el bash. El a nombre signica Bourne Again Shell. Tiene licencia GNU y se suele incluir como shell predeterminado en las distribuciones. Ofrece las mismas capacidades que csh, pero incluye funciones avanzadas, tanto para el usuario como para el programador. En particular, podremos acceder a un historial de los comandos ejecutados, que se conserva incluso al pasar de una sesin a otra, utilizando los cursores. o Adems, completa los nombres de comandos y archivos automticamente, al presionar la tecla a a TAB. Hay muchas otras versiones de shell adems de stas. Pero el estilo general de todos es muy similar. a e Lo que estudiemos en este curso ser compatible con la mayor de ellos. a a

4.1.

Metacaracteres

Adems de ejecutar los comandos que nosotros le indicamos, el shell interpreta ciertos caracteres a especiales, a estos caracteres los llamamos metacaracteres. Cuando nosotros utilizamos algn metacaracter, los comandos no lo reciben, sino que el shell lo u reemplaza por lo que corresponda, y le pasa al comando ejecutado el resultado de ese reemplazo. Eso es lo que entendemos por interpretar: reemplazar el caracter por otro caracter o por una cadena de caracteres, segn corresponda. u 4.1.1. Metacaracteres relacionados con archivos

* Cuando el shell encuentra un *, lo reemplaza por una lista de los archivos que concuerdan con la expresin indicada. o Por ejemplo: echo * nos mostrar todos los archivos del directorio. echo a* nos mostrar todos a a los archivos del directorio que comiencen con a. echo *o nos mostrar todos los archivos que a terminen con o. echo /usr/local/* nos mostrar todos los archivos que estn en ese directorio. a e En el caso de que no hubiera ningn archivo que concuerde con la expresin, generalmente, nos u o mostrar la expresin que hayamos escrito. a o

12

? Al encontrar un ? el shell lo reemplaza por cualquier otro caracter. Es decir que la expresin que o escribamos se reemplazar por todos los archivos que en esa posicin tengan cualquier caracter, a o y en el resto de la cadena tengan lo que hemos escrito. Por ejemplo: echo ?ola nos podr mostrar archivos como hola, sola, Pola. echo a??a, podr a a mostrar alla, arca, asia. Al igual que con el *, si ningn archivo concuerda con el patrn, generalmente, nos mostr la u o a misma expresin que hemos escrito. o [ ] Encerrados por los corchetes, podemos escribir un rango de caracteres con los cuales queremos que el shell concuerde. Por ejemplo, ls [af]* nos mostrar todos los archivos que comienzan con a o con f. a Podemos adems especicar un rango de caracteres, con un guin en el medio. Por ejemplo, a-z a o (letras minsculas), 0-9 (nmeros), etc. y combinarlos con caracteres individuales siempre que u u no sea ambigua la interpretacin. (Considerar la concordancia con el caracter -). o Por ejemplo, podemos querer slo los archivos que comienzan con nmeros seguidos de un -, en o u ese caso escribir amos ls [0-9]-*} o ls [0-9][0-9]-*, si comienzan con dos nmeros seguidos u de un -. [ ] Cuando al comienzo de la cadena que est encerrada por los corchetes encontramos el caracter a ^, estamos indicando que debe concordar los caracteres que no se encuentran en el rango. Por ejemplo, ls [^0-9]*, nos listar todos los archivos que no comiencen con un nmero. a u 4.1.2. Metacaracteres relacionados con comandos

Ejecutar un comando es tan sencillo como escribir el comando y apretar ENTER. Sin embargo, utilizando algunos de los metacaracteres de shell podemos combinar los comandos entre s y lograr , resultados mucho ms importantes. a ; El ; es un separador de comandos, nos permite ejecutar un comando a continuacin de otro, equio valente a lo que suceder si ejecutramos primero uno, y al terminar ejecutramos el siguiente. a a a Es decir si escribimos ls; echo Hola veremos la salida del echo a continuacin de la del ls. o ( ) Los parntesis sirven para encerrar grupos de comandos, y tratarlos como si fueran uno solo. e & El & manda el comando a background, esto quiere decir, que nos devuelve la l nea de comandos inmediatamente despues de apretar Enter, mientras el comando sigue ejecutndose en segundo a plano. La ejecucin de tareas en segundo plano ya se ha estudiado anteriormente, cuando se vieron los o comandos relacionados con procesos. Este metacaracter funciona de manera equivalente, y sus resultados pueden corroborarse utilizando el comando jobs. Para ver un ejemplo, vamos a usar un nuevo comando, sleep, (un comando simple que espera una determinada cantidad de segundos). Por ejemplo sleep 5, espera 5 segundos antes de devolvernos la l nea de comandos. Ahora, utilizando &: (sleep 20; echo Hola) &. Al escribirlo nos mostrar el PID del comana do que estamos ejecutando, y nos devolver el shell; 20 segundos despus, veremos aparecer a e Holaen nuestra l nea de comandos. Antes de que termine de ejecutarse, podemos ejecutar jobs y observar que el proceso se est ejea cutando, o bien ps y observar que el comando en ejecucin es sleep. o 13

Ejercicio: hacer un comando equivalente que nos avise que ya pasaron los cinco minutos necesarios para que hierva una pava de agua. Adems, el & nos puede servir para separar comandos: cada vez que lo utilizamos para separar a comandos, mandar al comando que est a su izquierda a background. a e 4.1.3. Otros metacaracteres

... Al encontrar una cadena encerrada entre , el shell tomar el contenido de la cadena literalmente, a es decir, sin interpretar los metacaracteres contenidos en ella. Por ejemplo, echo * ?* [A-Z-]* nos mostrar * ?* [A-Z-]*. a Notar que si no cerramos las comillas y apretamos ENTER, el shell nos mostrar una l a nea en blanco esperando que sigamos ingresando nuestro comando, hasta que cerremos las comillas. \ Utilizamos una \ para escapar el siguiente caracter. Escapar signica que el shell no lo interpretar como un metacaracter. a Por ejemplo echo \* nos mostrar un *. a

# El # es el sealador de comentario. Si el shell encuentra un # al comienzo de una palabra, descarn tar todos los caracteres hasta en nal de l a nea. Por ejemplo, echo 3.1416 # Pi con un error de 0.00 nos mostrar unicamente 3.1416. a 4.1.4. Entrada y Salida

UNIX tiene un extenso manejo de entrada y salida, es una de las caracter sticas principales que nos permite combinar pequeas herramientas para lograr resultados ms complejos. n a La mayor de los comandos UNIX que nosotros utilizamos tienen una entrada estndar, una salida a a estndar y una salida para errores estndar. Las denominamos stdin, stdout y stderr respectivaa a mente. La entrada estndard por omisin es el teclado, mientras que la salida estndard y la salida de a o a errores son, por omisin, la pantalla. o Un comando genrico, lee datos de la entrada estndar, los procesa de alguna manera, y luego e a emite el resultado por la salida estndar. En el caso de que durante el proceso hubiera algn error, a u emitir una aviso de ese error por la salida de errores. a El Shell se encarga de relacionar estos tres, lo cual no impide que un determinado programa maneje su entrada y su salida de una manera diferente. > El caracter > nos permite direccionar la salida estndar de un comando a un archivo. De manera a que ps ax > procesos guardar en el archivo procesos la salida del ps. a < El caracter < nos permite direccionar la entrada estndar de un comando desde un archivo. Por a ejemplo, el comando mail nos sirve para mandar mensajes a otros usuarios, si escribimos mail user < archivo mandar un mensaje con el contenido del archivo al usuario user. a >> Usar un >> en lugar de un > nos permite direccionar la salida estndar a un archivo, sin soa breescribirlo, sino que le agrega los datos que nosotros queramos al nal. Si ahora hacemos ps ax >> procesos tendremos el listado de procesos dos veces en un mismo archivo. 2> Utilizar 2> nos permite redirigir la salida de errores a un archivo. Por ejemplo, si ejecutamos ls archivo-feo 2> test, el error del ls, indicndonos que el archivo-feo no existe se almacea nar en test. a 14

| Para relacionar la salida estndard de un comando, con la entrada estndard de otro comando, a a utilizamos el caracter |. Por ejemplo, podemos relacionar la salida de ls con la entrada de wc. Haciendo ls | wc, la salida de este comando ser la cantidad de l a neas, palabras y caracteres que produjo ls. Este comando recibe el nombre de pipe, que en ingls signica caer o tuber Es decir que e n a a. es un comando que entuba la salida de un comando con la entrada de otro. Es interesante observar lo que sucede cuando hacemos: ls > nuevo-archivo, esto es, el archivo nuevo aparece dentro del listado que hace ls. Esto se debe a que el shell, al hacer la relacin entre el o archivo y el comando, crea el archivo, y luego llama al ls. Adems es necesario tener en cuenta que un comando no puede utilizar como entrada y salida a un mismo archivo. Por ejemplo, al ejecutar cat archivo > archivo, el intrprete de comandos nos e indicar que esto no es posible. a 4.1.5. Ejercicios

1. Explicar en qu se diferencian ls * y echo *. e 2. Explicar en qu se diferencian ls / y echo /. e 3. Crear un archivo que contenga la cantidad de archivos en un directorio. 4. Crear dos archivos: a.txt, que contenga hola, y b.txt, que contenga chau. Luego concatenarlos en un archivo ab.txt.

5.

Manejo de Archivos

Una de las caracter sticas de UNIX es que todo es un archivo. Esto no es una simplicacin, el o sistema representa los dispositivos (disco r gido, placa de sonido, CDs, oppys, algunas conexiones de red, etc) que estn conectados a l como archivos. a e Estos archivos estn todos ubicados a partir del directorio ra a partir del cual se abre un rbol a z, a de directorios. Al directorio ra se lo identica como /. Si hacemos ls / veremos los directorios que z se abren a partir del ra z. Una de las ventajas del manejo de archivos de UNIX es que los usuarios no necesitan saber dnde o est cada directorio. Cuando hacemos ls / puede suceder que algunos directorios estn en el disco a e r gido de la PC, otros estn en un servidor de la red, otros en algn otro servidor, y nosotros no nos e u enteraremos. Identicamos con el nombre de le-system a una estructura jerrquica de directorios y archivos. a Es decir, una determinada coleccin de archivos. En un solo sistema UNIX pueden estar montados o varios le-systems diferentes. Esto es, un solo sistema UNIX puede agrupar los archivos que estn a almacenados en distintas particiones de un disco r gido, en una diskettera, en un CD, etc. El rbol de directorios que vemos a partir del directorio ra es la forma en la que organizamos a z, los archivos, no necesariamente el lugar donde los archivos estn ubicados f a sicamente.

5.1.

Montar y desmontar le-systems

Utilizando el comando mount veremos los le-systems que tengamos montados. La salida de este comando nos lista: la identicacin del le-system, el lugar en el rbol de directorios en el que o a est montado y el tipo de le-system que constituye. Adems, entre parntesis, podemos ver los ags a a e con los que se ha montado. 15

Cuando queremos leer de un diskette, deberemos montarlo, ya que el diskette constituye una nueva estructura de archivos. Podremos montar diskettes que estn grabados en distintos formatos, e por ejemplo msdos, ext2, etc. Para montar el diskette utilizaremos mount /floppy, ya que /oppy es el directorio en el que est congurado que se debe montar el dispositivo de la diskettera, como un tipo de le-system a automtico, es decir que detecta automticamente qu tipo de lesystem se tiene. a a e Es necesario desmontar el diskette antes de sacarlo, ya que -si no lo hacemos- el sistema puede no haber terminado de actualizar los cambios hechos al le-system del diskette. Para desmontarlo utilizaremos el comando: umount /floppy. Otro comando relacionado con los le-systems que se encuentran montandos en el sistema es df. Este comando nos muestra el espacio que est siendo utilizado y el que todav est libre, en los a a a le-systems que se encuentren montados.

5.2.

Arbol de directorios

Existen diferentes maneras de ordenar la informacin dentro de los directorios. Veremos un orden o bsico que la mayor de las distribuciones utilizan. a a /bin contiene los archivos ejecutables bsicos del sistema. Muchos de estos comandos ya los usamos a o los vamos a usar en el futuro. En este directorio, por ejemplo, encontramos algunos de los comandos de shell que nombramos. /dev contiene los archivos que representan a dispositivos. Los archivos que se encuentran en este directorio estn relacionados con perifricos de la mquina, por ejemplo: /dev/fd0 es el archivo a e a que representa la primera diskettera, /dev/hda representa al primer disco r gido IDE, /dev/hda1 representa la primera particin del primer disco r o gido IDE, /dev/tty representa la consola actual que se est usando. Asi: echo hola > /dev/tty nos mostrar la misma salida que un simple a a echo hola. Estas identicaciones corresponden al sistema de archivos utilizado por las distribuciones de GNU/Linux. En otros sistemas UNIX (como BSD, Solaris, etc). Las identicaciones sern disa tintas, pero las podremos encontrar en el mismo directorio /dev. Un dispositivo curioso es /dev/null. Se trata de un dispositivo que borra todo aquello que se mueva a l, como un agujero negro. Otro dispositivo interesante es /dev/random, que nos e muestra basura random, es decir cualquier tipo de caracteres, generados al azar segn los u procesos que se estn ejecutando en la mquina y la entrada del usuario. e a /etc contiene los archivos de conguracin del sistema y de muchos de los programas instalados en o el sistema. Adems, contiene los scripts de inicio que se ejecutan cuando arranca la mquina. a a Generalmente los archivos que se encuentran en este directorio pueden ser editados slo por el o administrador de la mquina, es decir el superusuario, normalmente llamado root. a /home en este directorio se encuentran los directorios principales de los usuarios. En estos directorios los usuarios tienen permisos de leer, escribir y ejecutar segn deseen. u /lib contiene las librer necesarias para ejecutar los comandos que se encuentran en /bin y /sbin. as Las librer son rutinas que los programas utilizan frecuentemente, y pueden ser compartidas as por varios programas al mismo tiempo. Esto se debe a que las librer no estn inclu as a das dentro de los programas, para que sea sencillo reusar el cdigo, y aprovechar mejor el espacio. o 16

En otros sistemas UNIX, las librer pueden estar inclu as das en los comandos, con lo cual este directorio no es necesario. /sbin contiene los archivos ejecutables que son necesarios para poder administrar el sistema. /usr contiene archivos que sern utilizados una vez que el sistema ya est funcionando. No son a a imprescindibles para el funcionamiento del sistema. Por dentro se subdivide nuevamente en un rbol muy parecido al del directorio ra a z. Encontramos, adems, directorios como src (donde se suelen guardar los archivos con el cdigo a o fuente del sistema), games (que tiene juegos), X11R6 (que contiene el sistema X), share (que contiene archivos a los que pueden acceder todos los programas y todos los usuarios).

5.3.

Los archivos por dentro

El contenido de un archivo comn no es mas que una sucesin de bytes, pero cmo est esta u o o a informacin almacenada y cmo accedemos a ella es ms interesante. Para tener una idea de cmo se o o a o guarda la informacin en los sistemas UNIX veremos el manejo de inodos. o 5.3.1. Inodos

Un inodo contiene el tamao de un archivo, las tres fechas relacionadas con el archivo (modicacin n o del contenido, acceso al contenido y modicacin del inodo), los permisos, el dueo, el grupo, el nmero o n u de links, e informacin sobre dnde estn f o o a sicamente los datos (los bytes) del archivo en el disco. Notemos que el nombre del archivo no est guardado en el inodo. a De esta forma, un directorio es simplemente un archivo que contiene una lista de nmeros de u inodos y nombres de archivos. 5.3.2. Links

Dentro del inodo se guarda el nmero de links del archivo. Un link es una entrada en un directorio, u es decir en la lista de inodos y nombres de archivos. Un archivo puede tener muchos links. Esto signica que dos archivos con distinto nombre pueden apuntar a un mismo inodo, y por lo tanto tener el mismo contenido. Son el mismo archivo con dos nombres diferentes. Es importante recalcar que una vez creado el link, es imposible decir cul es el nuevo archivo y a cul es el que ya estaba creado. Si borramos uno de estos archivos, no se borrar el contenido del a a archivo, sino unicamente la entrada de directorio, y se decrementar la cantidad de links al inodo. a Solamente se eliminar el contenido del archivo cuando el nmero de links llegue a cero. a u A este tipo de links se los llama hard links, existe otro tipo de links, llamado soft links o tambin e symlinks (Symbolic Link). Estos links no comparten el inodo del otro archivo, ni aumentan la cantidad de links que tiene el otro archivo, porque se trata unicamente de un puntero a otro archivo, que se puede encontrar en cualquier parte del sistema de archivos. Es muy similar al Acceso Directo de Windows. Dado que los datos de los inodos se guardan por separado en cada dispositivo (es decir, particin o de disco, CD, oppy, etc), no es posible crear hard links entre dispositivos diferentes. Sin embargo, s es posible crear symlinks. 5.3.3. ln

El comando ln nos permite crear tanto hard links como soft links.

17

Para crear un hard link deberemos escribir ln viejo nuevo. De tal manera que nuevo estar asiga nado al mismo inodo al que ya estaba asignado viejo. Si hacemos ls -li del directorio actual, podemos ver el nmero de inodo en la primera columna, y el nmero de links en la tercera. veremos que u u tanto viejo como nuevo tienen el mismo nmero de inodo y de links. u Para crear un symlink utilizamos ln -s viejo nuevo. En este caso, al hacer ls -li vemos que nuevo tiene un inodo diferente a viejo, y que en el nombre aparece la ruta a la que apunta.

5.4.

Permisos

Como ya dijimos antes, todos los archivos tienen un dueo y un grupo. Para ver el dueo y el n n grupo, podemos hacer ls -l, la tercera columna es el usuario y la cuarta el grupo. Analizaremos la primera columna (que puede parecer un jerogl co, pero lo que nos indica es los permisos que tiene cada archivo). El primer caracter nos indica qu tipo de archivo es. Si tiene una "d" es un directorio, si tiene una e "l" es un symlink, si tiene un "-" es un archivo comn. u Los siguientes tres caracteres indican los permisos que tiene el archivo para el dueo. La primera n columna indica lectura, y puede tener una "r" si est habilitado el permiso o "-" si no lo est. La a a segunda indica permiso de escritura, y puede tener una "w" si est habilitado o un "-" si no lo est, a a la tercera indica ejecucin, y puede tener una "x" si est habilitado o un "-" si no lo est. o a a Los otros tres caracteres son los permisos para el grupo, y los ultimos tres son los permisos para el resto de los usuarios. En el caso de los directorios, el permiso de lectura signica que se puede listar el contenido del directorio, haciendo -por ejemplo- echo dir/*, el permiso de escritura signica que se pueden crear y borrar archivos en el directorio y el permiso de ejecucin signica que se pueden buscar archivos, o hacer un cd, etc. 5.4.1. chmod

Para cambiar los permisos de un archivo utilizamos el comando chmod. Solamente el dueo de n un archivo (o el administrador del sistema) puede cambiarle los permisos a un archivo. An si no u tiene ninguno de los permisos explicados, el dueo del archivo siempre tiene permiso de cambiar los n permisos de un archivo. Hay dos maneras diferentes de utilizarlo. Podemos sumar o restar permisos a los que ya estn, o a bien congurar todos los permisos a la vez. Si queremos sumar o restar determinados permisos, utilizamos la siguiente sintaxis: chmod quien+que archivo. donde "quien" puede ser: u (usuario dueo), g (grupo), o (otros), o bien n a (todos). Y "que" puede ser r, w o x. Los permisos que no se agreguen ni quiten permanecern como a estaban. As si escribimos chmod u+r archivo le estamos agregando permiso de lectura al usuario. Si ha, cemos chmod o-w archivo le quitamos permiso de lectura a los dems. Por otro lado, escribiendo la a l nea chmod a+x,go-w archivo le agregamos permiso de ejecucin a todos los usuarios, y le quitamos o el de escritura a todos los que no son el dueo. n Por otro lado, existe una manera ms rpida, pero tambin un poco ms complicada de cambiar a a e a los permisos. Esta manera utiliza nmeros octales. Consideramos r = 4, w = 2 y x = 1. El valor del u permiso que queremos asignar ser la suma de los permisos. Y lo tenemos que escribir para el usuario, a el grupo y los otros. Ejemplo: chmod 644 archivo asigna permisos de lectura y escritura para el usuario y slo de leco tura para los dems. chmod 755 archivo asigna permisos de lectura, escritura y ejecucin al usuario a o 18

y de lectura y ejecucin a los dems. o a Si deseamos cambiar los permisos dentro de un directorio, de forma recursiva, podemos utilizar la opcin -R. o 5.4.2. groups - chgrp

Un usuario puede pertenecer a varios grupos. Para ver a qu grupos pertenece, utilizamos el e comando groups. Y el comando chgrp grupo archivo nos permite cambiar el grupo de un archivo. Solamente podemos cambiar el grupo a otro grupo que tambin pertenezcamos. e 5.4.3. chown

Este comando solamente lo puede ejecutar el superusuario, y le permite cambiar el dueo de un n archivo, pero como no tenemos permiso de superusuario, no podemos utilizarlo.

5.5.

Ejercicios

1. Indicar los comandos a utilizar para otorgarle a un archivo cualquiera permisos de: lectura y escritura solamente para el dueo del archivo; n lectura y ejecucin para todos los usuarios; o lectura para todos los usuarios, y escritura solamente para el dueo del archivo. n 2. Crear un directorio (por ejemplo pruebadir), y algunos archivos dentro (por ejemplo, arch1 arch2 arch3). Cambiarle los permisos de lectura, ejecucin y escritura al directorio y proo bar diversos comandos: echo prueba/*, cd prueba, touch prueba/arch4, rm prueba/arch3, ls prueba, etc. De este modo se puede apreciar qu signican realmente los permisos de lectura, e escritura y ejecucin en un directorio. o

19

6.

vi

Vi es un editor de texto para consola. Es el editor de texto tradicional de UNIX, y en muchos sistemas es el unico disponible, de manera que es importante saber usarlo, aunque ms no sea bsi a a camente. Para comenzar a editar un archivo deberemos escribir: vi archivo, o bien ejecutar vi, y luego abrir el archivo con el comando adecuado. En vi existen dos modos de trabajo: un modo de edicin y un modo de comandos. Al iniciar el o programa, estamos en el modo de comandos. Para ingresar al modo de edicin debemos apretar i, o o bien, Insert. Para volver al modo de comandos, utilizamos la tecla ESC. Cuando estemos en el modo de edicin, todo lo que ingresemos ser texto del archivo. Cuando o a estemos en el modo comandos, no. A veces lo que escribamos no mostrar ninguna salida inmediata a en la pantalla.

6.1.

Comandos Bsicos a
abre el archivo. sale del programa, solo si ya se grabaron los cambios. sale del programa sin grabar los cambios. graba el archivo. graba el archivo con ese nombre (eq. Guardar Como) graba el archivo y luego sale del programa.

:e archivo :q :q! :w :w archivo :wq

6.2.
0 b h k G

Teclas de Movimientos
inicio de l nea. anterior palabra. izquierda. arriba. n de archivo. $ w l j n de l nea. prxima palabra. o derecha. abajo.

A la mayor de estos comandos se les puede agregar un nmero al principio. El efecto de este a u nmero ser el de multiplicar el efecto del comando por el nmero ingresado. Por ejemplo, 10j se u a u mueve 10 lineas hacia abajo. En el caso de G, el nmero que se le agregue antes puede ser el nmero de linea al cual deseamos u u ir. Si deseamos ir a la primera l nea del archivo, debemos escribir 1G.

6.3.

Manejo de Texto

Como en cualquier editor de texto, podemos cortar, copiar y pegar. dd dw d$ p u yy x corta la l nea. corta la prxima palabra. o corta hasta el nal de la l nea. pega lo que se haya cortado o copiado (undo) deshace la ultima accin. o copia la l nea. corta el caracter.

Muchos de estos comandos tambin aceptan un nmero que los preceda, de tal manera que se e u pueden seleccionar varios caracteres, palabras o l neas a un mismo tiempo. 20

6.4.

B squedas u

Ingresando /texto, (ENTER) nos llevar a la prxima aparicin de texto. Para ir a la anterior: a o o ?texto (ENTER). Una vez que lo hemos buscado, presionando n iremos a la siguiente aparicin, y o presionando N iremos a la anterior.

6.5.

Otros

CTRL-g muestra la l nea actual y el total de l neas. o agrega una l nea debajo de la actual, y entra en modo insercin. o a se coloca en el caracter siguiente al actual, y en modo insercin. o

6.6.

Ms informacin a o

Dentro del mismo vi es posible obtener ayuda sobre cmo manejarlo, utilizando el comando :help, o desde el modo comandos. Para salir de la ayuda y volver al archivo que se estaba editando: :q. Una de las versiones de vi ms difundida es el vim (Vi Improved). Tiene muchas ms caracteristicas, a a como resaltado de sintaxis (syntax highlighting) y muchas otras cosas ms. Para los recin iniciados a e existe un comando vimtutor, que nos da unas breves clases sobre el uso de vim.

7.

Emacs

A pesar que emacs no se encuentra en todos los sistemas UNIX, y por lo tanto no es una herramienta con la que podemos contar en cualquier caso, es uno de los procesadores de texto ms a utilizados. En realidad es mucho ms que un procesador de texto, puede utilizarse como un lector a de correo y de noticias, un navegador web, una interfaz para varios juegos, y hasta un entorno de programacin y desarrollo. o Esto es posible porque emacs es principalmente un intrprete del lenguaje LISP, un lenguaje que e fue desarrollado para la investigacin de inteligancia articial. Dentro de emacs, es el intrprete de o e LISP quien ejecuta un editor de texto y el que interpreta cada uno de nuestras entradas. Sin embargo, en esta introduccin utilizaremos simplemente sus capacidades como editor de texto. o

7.1.

Una breve recorrida

Para ejecutar emacs podemos, desde la l nea de comandos escribir emacs, y dentro del emacs abrir el archivo que queramos editar. O bien, abrir el archivo al entrar al emacs ejecutando emacs archivo, es posible, adems, comenzar a editar varios archivos a la vez, utilizando emacs arch1 arch2 arch3. a Para abrir un archivo dentro de emacs, se utilizan las teclas Ctrl-x Ctrl-f. Esto muestra un mensaje en la parte inferior de la pantalla Find file: ~/, que indica que a continuacin puede o ingresarse el nombre del archivo a editar. Al igual que dentro del intrprete de comandos bash, la e tecla TAB nos ser de gran utilidad, ya que completar automticamente el nombre del archivo, o a a a desplegar una lista de los archivos que coincidan con el nombre que se escriba. a Una vez que hemos escrito lo suciente, se puede grabar utilizando Ctrl-x Ctrl-s. Para salir de emacs usamos las teclas Ctrl-x Ctrl-c. emacs preguntar si queremos guardar los a cambios hechos, contestando "y" se grabarn los cambios, mientras que "n" no los grabar, y "!" no a a guardar ningun cambio. a

21

7.2.

Meta y Control

Emacs es un editor que no tiene multiples modos como el vi. Es decir, en cuanto se abre el editor ya est listo para que empieces a escribir y todo lo que se escriba lo incluir en el archivo que se a a est editando. a Para acceder a un comando del editor debemos apretar una combinacin de teclas. Para eso usamos o unas teclas denominadas Meta y Control junto con otras teclas. Estas teclas no se muestran en el texto, son rdenes al editor. La tecla Meta en la mayoria de las PCs modernas no existe y en su o reemplazo puede encontrarse la tecla ALT o la tecla windows. Tambin es posible usar la tecla ESC como reemplazo de la tecla Meta. Pero en ese caso la tecla e ESC no es apretada al mismo tiempo que la otra tecla, sino que apretamos primero la tecla ESC, la soltamos y luego apretamos la tecla que dispare el comando o accin del editor. o Por ejemplo, para acceder al tutorial debemos apretar Ctrl-h t, esto signica apretar la tecla Control al mismo tiempo que la tecla h y luego la tecla t. Por comodidad, dentro de los tutoriales y ayudas de emacs (y tambin dentro de esta breve introduccin), se escriben estas combinaciones con e o una C para Control y una M para Meta.

7.3.

Ventanas (Buers)

emacs es un editor que nos permite trabajar con mltiples archivos a la vez. Cada archivo lo deja u disponible a travs de distintos buers, que son distintas ventanas a las que el usuario puede acceder; e puede cambiar de una ventana a otra en cualquier momento o tener varias ventanas de texto a la vista dentro de la misma pantalla (dividindola al medio, en cuartos, en octavos, etc). e Para obtener una lista de las distintas ventanas disponibles, podemos apretar C-x b, esto dividir la pantalla actual en dos y en la parte inferior tendremos una lista de todas las ventanas a disponibles. Con C-x o podemos pasar de la ventana superior a la inferior, y viceversa. A continuacin, algunas otras teclas que pueden llegar a resultar utiles en el manejo de ventanas. o C-x 2 C-x 3 M-C-v C-x o C-x b C-x k C-x 0 Divide la ventana actual en dos partes horizontales Divide la ventana actual en dos partes verticales Avanza una pantalla en la otra ventana Cambia de ventana Muestra una lista de todas las ventanas disponibles Cierra la ventana actual Cierra la otra ventana

7.4.

Algunas combinaciones de teclas

A continuacin, algunas otras combinaciones de teclas que pueden resultar utiles en el uso de o emacs. 7.4.1. Deshacer y volver a hacer

o Para deshacer el ultimo cambio realizado, se utiliza la combinacin C- . Esta combinacin puede o presionarse tantas veces como se desee para ir deshaciendo todos los cambios realizados. Si, llegado un punto, si quiere volver a realizar los cambios que se han deshecho, simplemente se realiza cualquier cambio (por ejemplo, escribir un caracter) y luego se vuelve a presionar C- tantas veces como sea necesario.

22

7.4.2.

Teclas de movimientos

Dentro de emacs es posible utilizar los cursores para moverse a travs del texto del archivo, pero e adems es posible utilizar estas teclas. a C-n C-f M-f C-a M-a M-arriba C-v M-< 7.4.3. Baja una l nea Avanza un caracter Avanza una palabra Principio de l nea Principio de oracin o Principio de prrafo a Sube una pantalla Principio de la ventana C-p C-b M-b C-e M-e M-abajo M-v M-> Sube una l nea Retrocede un caracter Retrocede una palabra Fin de l nea Fin de oracin o Fin de parrafo Baja una pantalla Fin de la ventana

Teclas para copiar y pegar

En emacs, para poder copiar y pegar, primero se inicia la seleccin del texto, luego se mueve el o cursor hasta el nal de la seleccin (el programa normalmente no indica que se est marcando el o a texto), y una vez que se llega al nal de la seleccin se presiona la combinacin correspondiente a o o cortar o copiar, segn se desee. u C-espacio Comenzar a marcar C-w Cortar la regin marcada o M-w Copiar la region marcada C-y Pegar la regin que se haya cortado o copiado. o 7.4.4. Teclas para realizar b squedas u Busca hacia abajo Busca hacia arriba Repite la bsqueda u Busca utilizando una expresin regular o Reemplaza en el texto, con conrmacin o

C-s C-r C-s C-s M-C-s M- % 7.4.5.

Teclas de borrado Borra Borra Borra Borra Borra un caracter una palabra la palabra anterior una l nea una oracin o

C-d M-d M-del C-k M-k

23

8.

Scripts de Shell - Bsicos a

Siempre que interactuamos con el shell estamos creando pequeos programas. Cuando a estos n pequeos programas los guardamos en un archivo que pueda ejecutarse luego, lo llamamos un script. n Estos scripts sirven, entre otras cosas, para tareas de automatizacin. o Los scripts de shell son bsicamente programas escritos en el lenguaje del shell, se parecen a los a archivos .BAT del DOS. Aunque es cierto que, si se van a escribir ms de varias decenas de l a neas de script, es mejor recurrir a un lenguaje diferente del shell, pensar en que los scripts de shell son solamente pequeos programas ser cometer una injusticia con la exibilidad y comodidad que ofrecen n a al usuario. Normalmente los scripts de shell se crean cuando es necesario combinar en una unica accin una o tarea rutinaria. Estos scripts pueden ser muy breves (una sola l nea), o bastante largos (varias pantallas). Vamos a empezar con algunos ejemplos muy sencillos.

8.1.

Primer Script de Shell

Creamos un archivo que contenga: who | wc -l, esto lo podemos hacer utilizando el comando echo, con la salida standard a un archivo, o bien utilizando el editor vi. El archivo lo llamaremos cuantos. Para poder ejecutar este pequeo script, tenemos que utilizar el intrprete del shell. Hay dos n e formas de hacerlo: sh cuantos, invocar al sh para que interprete nuestro script y lo ejecute. a El archivo no lo podemos ejecutar directamente, porque al crearlo, lo hemos creado como archivo de texto, y no tiene permisos de ejecucin. Para que podamos ejecutarlo tenemos que agregarle el o permiso: chmod u+x cuantos. Una vez que le hemos agregado el permiso, nuestro archivo ha pasado a ser un ejecutable, y se lo puede invocar como a cualquier comando. La l nea para invocarlo ser: a ./cuantos.

8.2.

La variable PATH

Llama la atencin el ./ que tenemos que agregar al principio para poder ejecutar el archivo. Esto o simboliza al directorio actual. Lo que estamos haciendo es dicindole al shell que busque el archivo e c uantosen el directorio actual. Esto se debe a que el directorio actual no est en la lista de los a directorios en los que el shell busca para encontrar un determinado comando. Los directorios en los que el shell busca son /bin, /usr/bin y algunos otros. Estn denidos en a una variable llamada PATH. Para poder ver el contenido de la variable PATH, podemos ejecutar desde l nea de comandos: echo $PATH. Es importante recalcar que la variable se llama PATH, pero para ver su contenido le agregamos el s mbolo $ adelante, este s mbolo es un metacaracter de shell, como los vistos anteriormente, y le dice al shell que lo que viene a continuacin es una variable. o

8.3.

Variables de entorno

As como PATH tambin existen muchas otras variables. Algunas determinadas por el sistema, y e otras determinadas por nosotros. Llamamos entorno al conjunto de variables, como el PATH, el nombre de usuario, el directorio actual, el directorio principal, las preferencias de lenguaje, etc. que determinan a la consola que estamos utilizando en este momento. Podemos ver cuales son las variables de nuestro entorno escribiendo: set.

24

A estas variables de entorno, nosotros podemos agregar nuevas variables. Para ello podemos escribir: variable=valor. Y haciendo echo $variable podremos ver el valor que le asignamos a la variable. Al ejecutar un programa, este programa recibe una copia de nuestro entorno, donde algunas variables pueden mantenerse (variables exportadas), y otras pueden no estar. Un programa puede modicar las variables que tiene en su entorno, pero no las del entorno anterior. A su vez, dentro de ese programa podemos ejecutar un nuevo programa, que tendr su propio entorno, con sus propias a variables. Para hacer que los programas hereden las variables que nosotros denamos, existe un comando llamado export, que nos asegura que los programas que se ejecuten, reciban esa variable en su entorno. Ejemplos Crear un script que contenga: echo $variable. Este script, no mostrar nada, ya que la variable a no ha sido exportada todav Para que el script muestre el valor de la variable, debemos ejecutar, a. en la l nea de comandos: export variable. Al ejecutar el script nuevamente veremos el valor de la variable. Crear otro script, que contenga: variable2=valor2;export variable2. Ejecutar el script, y luego, desde la l nea de comandos echo variable2. Esto no nos mostrar nada, ya que como a dijimos antes, no se puede modicar el entorno anterior. Crear otro script, que contenga: cd /; echo $PWD; export PWD. Al ejecutar el script, notar que por ms que el echo nos haya mostrado que el cd hab logrado cambiar de directorio, al a a volver del script, permanecemos en el directorio en el que estbamos al ejecutar el script. a

8.4.

Parmetros de los comandos a

Cuando ejecutamos un comando, puede suceder que necesite parmetros. En el caso de los scripts, a los parmetros se encuentran en variables especiales que identicamos como $1, $2, $3, etc. El nombre a de la variable nos indica la ubicacin del parmetro. o a Para ver esto en un script muy sencillo, armaremos un script que contenga la l nea echo $1, de forma que -al invocarlo- nos mostrar el parmetro que le pasemos al ejecutarlo. a a Para tener el caso de un script un poco ms util, vamos a hacer un script que nos permitir convertir a a rpidamente en ejecutables a los prximos scripts que realicemos: chmod +x $1. Le pondremos de a o nombre cx. Para hacer ejecutable este script, vamos a aprovechar lo que ya escribimos y haremos: sh cx cx. Podemos mejorar este script, de tal manera que reciba ms parmetros y pueda hacer ejecutables a a ms archivos a la vez. Podr a amos escribir, por ejemplo. chmod +x $1 $2 $3 ..., pero existe una manera ms elegante (y ms eciente): chmod +x $*. Al encontrar el $*, el shell lo reemplazar por a a a todos los parmetros que haya recibido el script. a Por ultimo, veremos la utilidad de las comillas dobles ("), en su relacin con los parmetros. o a Usaremos un script que contenga la l nea: echo "Buen da $1". Al ejecutarlo con un parmetro (por a ejemplo, Pedro), la salida del comando ser Buen da Pedro. a Si en el ejemplo anterior hubiramos utilizado comillas simples, la salida del comando hubiera sido e Buen da $1, ya que dentro de las comillas simples el metacaracter $ no es interpretado, mientras que dentro de las comillas dobles si.

25

9.

Filtros - Bsicos a

Existen una gran variedad de programas que reciben una entrada, la procesan y emiten una salida, a este tipo de programas le llamamos ltros. Estos son una parte fundamental del sistema ya que relacionando ltros simples se puede conseguir prcticamente cualquier cosa, a nivel de administracin a o de archivos y scripts.. Entre estos ltros estn: a cat grep, tail, head y cut less y more sort tr comm y di wc para para para para para para para mostrar la entrada. seleccionar una parte de la entrada. paginar la entrada. ordenar la entrada alterar la entrada en forma ordenada. comparar dos entradas. contar la entrada.

9.1.

grep

Un comando muy util que nos proporciona UNIX es grep. Su funcin principal es imprimir por o pantalla solamente las l neas que concuerden con un patrn que nosotros le indicamos. o Por ejemplo: ls -l | grep archivo, nos mostrar todas las l a neas del ls -l que concuerden con archivo. Algunas opciones de grep son: -i (ignore case) que no tiene en cuenta maysculas y minsculas. u u -n para que muestre el nmero de l u nea dentro del archivo. -v para que muestre las l neas que no concuerdan con la palabra ingresada. Vamos a hacer un ejemplo de una agenda sencilla, utilizando el comando grep y unos scripts de shell. En primer lugar necesitamos tener un archivo con unas cuantas l neas de la forma: nombre: telfono. Por lo menos cuatro o cinco l e neas, como para probar este ejemplo. Una vez que hemos creado el archivo, crearemos el script, que se llamar 110, y deber contener la a a siguiente l nea: grep -i "$*" agenda. Y para buscar un telfono dentro de nuestra agenda haremos: e 110 nombre.

9.2.

tail

El comando tail nos permite ver la cola de un archivo, es decir sus ultimas l neas (ltimas 10 u por omisin). Esto, aunque a simple vista no parezca util, resulta de gran utilidad para ver archivos o grandes como, por ejemplo, logs (archivos donde se guardan mensajes de estado y/o de errores). Para probar el comando vamos a utilizar los logs del sistema, que se suelen guardar en /var/log, en particular /var/log/messages es el archivo que contiene gran parte de los mensajes del sistema. Podemos hacer tail /var/log/messages y compararlo con la salida de cat /var/log/messages. Adems a tail podemos indicarle cuntas l a a neas queremos que nos muestre. Con la opcin -20, o por ejemplo, le dir amos que nos muestre 20 l neas y as con cualquier nmero que le pasemos. Tam u bien podemos decirle que nos muestre el contenido del archivo a partir de una determinada l nea, por ejemplo tail +5 archivo nos mostrar el contenido del archivo desde la l a nea 5 en adelante. Otro comando similar a tail es head. Su comportamiento es muy similar, pero en lugar de mostrar las ultimas l neas de la entrada, muestra las primeras. 26

9.3.

sort

Este comando nos permite obtener una salida ordenada, si hacemos ls | sort obtendremos la salida de ls con un orden alfabtico. e Ahora probemos ls -i | sort, sort ordena la salida de ls alfabticamente, eso quiere decir que e los nmeros no van a estar ordenados de menor a mayor sino en orden alfabtico. Para ordenarlos u e numricamente existe la opcin -n, ls -i | sort -n producir una salida ordenada de menor a mae o a yor. Si quisiramos, en cambio, que lo ordene de mayor a menor, debemos usar ls -i | sort -nr, e es decir -r ordena en orden inverso. Tambin podemos ordenar por una determinada columna, para entender esto de una manera ms e a clara veamos la salida de ls -l, estas l neas pueden ser ordenadas por tamao, por nombre, por fecha, n etc. Para eso tenemos que indicarle cul columna tiene que ordenar y con qu criterio. Notar que sort a e cuenta las columnas empezando de 0. Por ejemplo: ls -l | sort +4nr ordena la salida de ls por el tamao dejando los ms chicos al nal. En este n a caso, la n, que indica ordenamiento numrico es opcional, ya que sort decide automticamente el e a ordenamiento. ls -l | sort +4n +8 ordena la salida de ls primero por tamao y luego por el nombre del arn chivo. En este caso, es necesario poner la n, que indica ordenamiento numrico. e Tambin existe un opcion -u que nos permite eliminar las lineas iguales adyacentes de la salida de e sort. Es decir que si nuestra salida produce dos l neas iguales una debajo de otra, ver amos solamente una l nea.

9.4.

tr

Este comando nos permite transliterar caracteres, es decir cambiar determinado caracter por otro. Si escribimos tr a-z A-Z < archivo, veremos que tr transforma todas las minsculas en u maysculas. u Los parmetros del ejemplo anterior son rangos (de la a a la z y de la A a la Z), pero no a es necesario que lo sean. Lo que s nos exige tr es que los parmetros tengan la misma cantidad de a caracteres, o bien que el segundo sea un solo caracter. En este ultimo caso reemplazar todos los a caracteres del primer parmetro con el del segundo. a La opcin -c indica que deben transliterarse todos los caracteres que no estn inclu o e dos en el primer parmetro. a Ejemplo dif cil: cat archivo | tr -c a-zA-Z \n | tr A-Z a-z | sort -u El primer tr convierte todo lo que no sea letras en \n (retorno de carro), el segundo convierte todas las maysculas en minsculas y el sort del nal las ordena alfabticamente eliminando las u u e l neas iguales, con lo que obtenemos una palabra por l nea.

9.5.

comm

Este comando nos sirve para comparar el contenido de dos archivos, l nea por l nea. Para poder probar este comando, debemos crear dos archivos parecidos, que tengan unas cuantas l neas en comn, u y otras distintas. Luego, debemos hacer: comm archivo1 archivo2.

27

La salida est separada en tres columnas: en la primera columna estarn las l a a neas que estn en a el primer archivo y no en el segundo, en la segunda columna veremos las l neas del segundo archivo que no estn en el primero y por ultimo, en la tercera columna, las que estn en los dos. e a Adems podemos indicar cul de esas columnas no queremos que muestre, por ejemplo comm -12 arch1 arc a a muestra solamente la tercera columna, es decir, las l neas que estn en ambos archivos. a El problema que tiene comm es que espera que las l neas estn ordenadas alfabticamente, o en e e la misma posicin dentro del archivo. De modo que puede suceder que archivos muy similares sean o procesados por comm como archivos muy diferentes. Para procesamiento ms avanzado de diferencias a de archivos puede utilizarse el comando diff. Ejemplo: En /usr/share/dict/ normalmente tenemos un archivo diccionario, en el cual encontramos una palabra por rengln. En especial, el archivo words suele ser un symlink al diccinario del idioma de o nuestro sistema. Lo que vamos a hacer es armar un pequeo analizador ortogrco, usando los ltros recin vistos. n a e Utilizaremos comm para vericar si la palabra est en el diccionario, y que nos avise si no est. Primero a a deberemos llevar el texto a una palabra por l nea ordenada alfabticamente (que es el ejemplo que e utilizamos con tr). Y luego, utilizar comm para comparar con el diccionario. El comando completo ser: a cat archivo | tr -c a-zA-Z \n | tr A-Z a-z | sort -u | comm -23 - /usr/share/dict/words Notar que el - como parmetro del comm le indica que use la entrada estndar para leer el primer a a archivo.

10.

Filtros - Avanzados

Existen, adems de los ltros que ya vimos, otros dos ltros muy poderosos, llamados sed y awk. a Tienen una sintaxis tan avanzada que se los considera pequeos lenguajes de programacin. En este n o curso no los vamos a estudiar. Sin embargo, gran parte de la potencia de estos es su manejo de expresiones regulares que es el mismo que el de grep, que veremos a continuacin. o

10.1.

grep

Como ya vimos, podemos hacer grep patrn archivos y veremos las l o neas que concuerdan con el patrn en esos archivos, o La gran fortaleza de grep se encuentra en la sintaxis del patrn. Hasta ahora, el patrn que o o ingresbamos era simplemente una palabra, y eso le indicaba a grep que deb encontrar las l a a neas que contuvieran esa palabra. Sin embargo, en ese patrn podemos incluir lo que se llama una expresin regular. Las expresiones o o regulares son cadenas de caracteres que permiten transmitirle a los ltros una bsqueda mucho ms u a avanzada. Tenemos la posibilidad, por ejemplo, de indicar si queremos que algo est al principio o al e nal de un archivo, si queremos que est repetido una determinada cantidad de veces, etc. e El s mbolo ^ indica comienzo de l nea, es decir que el patrn que est a continuacin debe estar o e o al principio de la l nea.

28

Por ejemplo, podemos querer ver todas las l neas del comando who que comienzan con un nombre de usuario en particular. Esto lo har amos ejecutando: who | grep ^usuario. De una manera similar $ al nal de un patrn signica que debe estar ubicado al nal de la o l nea. El . acta como el ? en el shell, concuerda con cualquier caracter, una sola vez. u Por ejemplo, si hacemos ls -l | grep ^.......rw veremos los archivos que tengan permisos de lectura y escritura para el resto mundo. Tambin tenemos un manejo de rangos [...] muy parecido al del shell. e El * nos permite que el ultimo caracter se encuentre 0 o ms veces. Es decir, utilizando .* a obtendremos el mismo comportamiento que el del * de shell. Por ejemplo, ls -l | grep ^.*rw puede mostrarnos los archivos que tengan algn permiso u de escritura y lectura, o bien algn archivo que contenga las letras rw en su nombre. u Un problema comn es que muchos de los caracteres que grep usa como caraceres especiales son u los mismos que usa el shell como metacaracteres y esto puede llegar a confundirnos mucho, por lo que usamos los patrones entre comillas simples (...) para evitar problemas de intrepretacin del shell. o Pero tambin podemos querer que el grep no interprete determinado caracter en ese caso usamos \. e

10.2.

egrep o grep -E y fgrep o grep -F

En realidad, grep es el primero de una familia de comandos, egrep tiene un set de expresiones regulares ms completo, mientras fgrep esta optimizado para manejo de archivos grandes, pero solo a busca literales. En la actualidad la version GNU de estos comandos resume los tres dentro de grep con las opciones -E y -F, pero existen ms, como el ngrep (network grep), grepmail, etc. a

10.3.

Expresiones de grep, egrep

Se listan a continuacin las expresiones de grep y egrep, por orden de precedencia, con una explio cacin somera de su signicado. o Expresin o c \c ^ $ . [...] [^...] r* r+ r? r1|r2 \(r\) (r) \num Signicado cualquier caracter no especial, concuerda a si mismo cancela signicado especial de c inicio de l nea n de l nea cualquier caracter individual cualquiera de los caracteres en ...; incluye rangos de tipo a-z cualquiera de los caracteres que no est en ...; tambin se incluyen e e los rangos a-z cero o ms ocurrencias de r a una o ms ocurrencias de r (egrep) a cero o una ocurrencia de r (egrep) expresin r1 o expresin r2 (egrep) o o agrupar expresin regular r (grep) o agrupar expresin regular r (egrep) o lo que concord con la num-sima expresin regular agrupada o e o 29

Ante la pregunta posible, que puede surgir mirando esta tabla, de cul es el signicado de (r) a cuando se utiliza grep, la respuesta es que simplemente concuerda con los parntesis, como cualquier e caracter sin signicado especial

10.4.

Ejercicios

Utilizando el diccionario que se encuentra en el directorio /usr/share/dict, encontrar las expresiones regulares que concuerdan con los siguientes tipos de palabras. 1. Pal ndromos de 3 letras (ej: ala, asa, ata). 2. Pal ndromos de 4 letras (ej: erre). 3. Pal ndromos desde 3 a 9 letras (ej: salas, rallar, anilina) 4. Palabras que tienen todas sus letras ordenadas alfabticamente. e 5. Palabras que tienen todas sus vocales ordenadas alfabticamente. e 6. Palabras que tienen todas las vocales. (ayuda: utilizar varios grep encadenados).

11.

Ms scripts de Shell a

Adems de las herramientas para manejo de variables que se explicaron anteriormente, el shell a nos permite utilizar herramientas para manejo de ciclos y para estructuras condicionales, veremos a continuacin cmo utilizar y manipular los parmetros y luego ejemplos que utilizan if, for, while y o o a case, junto con varias herramientas y caracter sticas del shell, como manejo de funciones, valores de retorno, etc.

11.1.

Parmetros a

Como ya hemos visto, los scripts de shell pueden recibir y manipular parmetros. Estos parmetros a a se representan dentro de los scripts como $1, $2, etc. El conjunto de todos los parmetros est reprea a sentado por $*, mientras que la cantidad de parmetros est representada por $#. a a Existe, adems un comando llamado shift que permite eliminar el primer parmetro de la lista, y a a correr todos los parmetros. De tal manera que el segundo parmetro pasa a ser $1 y as a a . Veremos un ejemplo sencillo: echo "Cantidad de parmetros: $#" a echo "Primer parmetro: $1" a shift echo "Segundo parmetro $1" a shift echo "El resto de los parmetros $*" a El comando set nos permite ver todas las variables de entorno. Pero adems, nos permite asignarle a valor a los parmetros $1, $2, etc. Por ejemplo: a set Viva GNU Linux echo "Primer parmetro: $1" a echo "Segundo parmetro: $2" a echo "Tercer parmetro: $3" a 30

11.2.

if

Es la estructura que permite ejecutar los comandos solamente si se cumple una determinada condicin. La sintaxis ms usual: o a if [ condicion ]; then comandos else comandos fi if [ condicion ]; then comandos fi

En realidad, los corchetes [ ] son un comando en si mismo, tambin llamado test, por eso, para e armar la condicin utilizamos la sintaxis de test. (para ms informacin: man test). o a o Las condiciones sern de este estilo: a !condicion Si condicion es falsa condicion1 -a condicion2 Las dos condiciones son verdaderas condicion1 -o condicion2 Una de las dos condiciones es verdadera cadena-de-caracteres La cadena no esta vac a -z cadena-de-caracteres La cadena esta vac a cadena = cadena Las dos cadenas son iguales cadena != cadena Las cadenas son distintas entero -eq entero Los enteros son iguales Por otro lado, tambin podemos colocar otra cosa que no sea el comando test, otros programas, e que le devuelvan al if un cero o un uno, que el if luego interpretar como false o true respectivamente. a O tambin, la palabras true y false. e Realizaremos un script que escriba un mensaje si hay ms de un usuario conectado y otro diferente a si hay slo un usuario conectado. o cuantos=who | wc -l if [ \$cuantos -gt 1 ]; then echo "Hay ms de un usuario conectado " a else echo "Slo vos ests conectado" o a fi En este script, primero guardamos la cantidad de usuarios conectados al sistema en la variable cuantos. Esto lo hacemos utilizando las comillas invertidas, que son un recurso que nos provee el shell para utilizar la salida de los comandos en nuestro codigo; cada bloque encerrado por las comillas invertidas es reemplazado por la salida del comando en cuestin. o Luego utlizamos la estructura de if para compararlo con 1, la opcion -gt del comando test signica mayor que. Recordar: el comando [ normalmente es sinnimo del comando test. o

11.3.

for

Es una estructura que permite una iteracin durante un nmero determinado de veces. o u La sintaxis: 31

for variable in lista; do comandos done La variable, cuando se la coloca al lado del for, no lleva el signo $ adelante, pero si en los comandos se hace referencia a ella, se debe escribir $variable. La lista puede ser: Una lista de nmeros. Ej: 1 2 3 4 u Una lista de archivos. Ej: *.java Una lista de argumentos. Ej: $* A continuacin realizaremos un script que recibe por parmetro todos los usuarios que queremos o a saludar y les manda un saludo a cada uno solamente si estn conectados al sistema. a for i in $*; do if who | grep "^$i" > /dev/null; then write $i << EoT Hola $i! EoT fi done Esta vez utilizamos la estructura for para procesar los argumentos de nuestro comando. Para cada uno de los parametros recibidos, vericamos si ese usuario est conectado o no. Para esto, abusamos a un poco del if y demostramos que no es obligatorio usar test con el if. Aqu utilizamos la salida de un comando. Si el usuario est conectado usamos el comando write (que le manda un mensaje a la consola del a usuario), para enviar un saludo a cada uno. Para poder mandar el mensaje, utilizamos un metacaracter de shell muy especial. Este metacaracter comienza con << EoT, y con esto le indica al shell que la entrada de este comando es todo lo que ingresmos a continuacin hasta la que encuentre una l o nea que solamente contenga la cadena EoT. Esta cadena podr ser cualquier otra, podriamos por ejemplo poner << blablabla, y luego dea ber amos terminar el texto con una l nea que contenga blablabla.

11.4.

while

Es una estructura que permite una iteracin hasta que una determinada condicin no se cumpla. o o La sintaxis: while [ condicion ]; do comandos done La condicin es equivalente a la del if. o A continuacin veremos otra manera de procesar los parmetros recibidos. o a while [ "$*" ]; do echo $1 shift done Este simple script imprime en cada l nea cada uno de los parmetros recibidos. Vemos que si a omitimos las el comando test nos devuelve un error, pues espera un solo parmetro. a 32

11.5.

case

En casi todos los lenguajes de programacin encontramos una estructura que nos permite realizar o distintas acciones segn el valor de una determinada variable. u En el caso del shell esta estructura es case. Y se utiliza con la siguiente sintaxis:
case $variable in patron1) comandos ;; patron2) comandos ;; esac

El patrn con el que comprobamos al utilizar case es similar al que utiliza el shell (* para cualquier o cadena, ? para cualquier caracter, [ ] para rangos, \ para escapar valores especiales y para escapar cadenas completas), ademas de un muy cmodo | para usarlo como o. o Para ver cmo es su funcionamiento, estudiaremos un ejemplo, en el que utilizamos el comando o cal. Este comando nos permite visualizar calendarios. Utilizado sin ninguna opcin nos muestra el o mes actual. Al agregar un nmero a continuacin (por ejemplo cal 2020) nos muestra el calendario u o de ese ao. Y si le pasamos dos parmetros (por ejemplo cal 11 2002) nos muestra el calendario de n a ese mes y ese ao. n Este comando no entiende nombres de meses (enero, febrero, etc), y al ejecutar cal 10 la salida ser el calendario del ao 10, no del mes 10 del ao actual, que es ms probablemente nuestra a n n a expectativa. El script que realizaremos permitir obtener un nuevo comando (ncal) que tenga estas a funcionalidades.
# Analizamos los parmetros. a case $# in 0) set date # Si no vino ningn parmetro, u a m=$2 # mostramos el calendario del mes actual y=$6 # y del a~o actual. n ;; 1) m=$1 # Si vino un slo parmetro, o a set date # mostramos el calendario de ese mes y=$6 # y del a~o actual. n ;; 2) m=$1 # Si vinieron dos parmetros, a y=$2 # mostramos el calendario de ese mes y a~o. n ;; esac # Seleccionamos el mes que corresponde. case $m in jan*|Jan*|ene*|Ene*) m=1 ;; feb*|Feb*) m=2 ;; mar*|Mar*) m=3 ;; apr*|Apr*|abr*|Abr*) m=4 ;; may*|May*) m=5 ;; jun*|Jun*) m=6 ;;

33

jul*|Jul*) aug*|Aug*|ago*|Ago*) sep*|Sep*) oct*|Oct*) nov*|Nov*) dec*|Dec*|dic*|Dic*) [1-9]|10|11|12) *) esac

m=7 ;; m=8 ;; m=9 ;; m=10 ;; m=11 ;; m=12 ;; ;; # El mes era numrico. e y=$m; m=""; # Slo vino el a~o. o n

# Llamamos al calendario con el mes que elegimos. cal $m $y

Un uso muy frecuente del case de shell se encuentra en los demonios de GNU/Linux. Los demonios son los servicios que se ejecutan en el sistema ms all de qu usuario es el que est loggeado. Suelen a a e a existir scripts de shell que se encargan de iniciarlos, detenerlos, reinciarlos, etc.

11.6.

Funciones

El shell nos provee de un manejo de funciones. Una funcin es un conjunto de instrucciones o encerradas en un bloque de cdigo, una caja negra que hace determinado trabajo. Deben ser declaradas o antes de poder llamarlas, y para llamarlas alcanza con tipear su nombre.
# declaracion de funcion funcion () { comandos } # declaracion alternativa. function funcion { comandos } funcion # Llamado a funcion

Las funciones reciben sus parmetros en $1, $2, $*, etc. Y devuelven valores entre 0 y 255, esto a se consigue con la instruccin de shell return. El valor que devuelven puede ser accedido en el script o en la variable $?. Normalmente, las funciones acceden a variables globales, para poder usar locales se debe usar la instruccin de shell local. o A continuacin, algunos ejemplos que se proponen armar una calculadora en shell. o
res=0; rem=0 add () { local i case $# in 0) res=0 ;; *) res=$1 shift for i in $*; do let res+=$i done ;; esac }

34

Se trata de una funcin que suma todos los parmetros que recibe. Si no recibe ningn parmetro o a u a el resultado es cero. En cambio, si recibe algn parmetro, inicializa la variable res con el valor del u a primer parmetro, que luego borra de la lista de parmetros con el comando shift. Y a continuacin a a o suma uno a uno, todos los otros parmetros, utilizando el comando de shell let, que permite realizar a operaciones aritmticas simples. e As como la suma, podemos ver tambin la multiplicacin y la divisin. e o o
mul () { local i case $# in 0) res=0 ;; *) res=$1 shift for i in $*; do let res*=$i done ;; esac } div () { local i case $# in 2) case $2 in 0) echo "Error: divisin por cero"; o res=0; rem=0 return 1 ;; *) let res=$1/$2 let rem=$1%$2 ;; esac ;; *) res=0; rem=0 ;; esac } add 3 255 123 123 30 29 4 mul $res 2 2 div $res 0 echo $res; echo $rem

Existen an ms capacidades para los scripts de shell, que no se explican en este curso. Ms u a a informacin puede encontrarse en la gran documentacin disponible en Internet, o leyendo el manual o o de bash. 35

También podría gustarte