1 Facultad: Ingeniería Escuela: Electrónica Asignatura: Arquitectura de computadoras Lab. de arquitectura de computadoras, edif. de electrónica. Tema: Uso de Bash en Linux Parte II. Objetivo general Aplicar el uso de un interprete de comandos en Linux. Objetivos específicos Ejecutar comandos del sistema Linux. Realizar tareas de mantenimiento y configuración de Linux usando programación del shell. Materiales y equipo 1 Computadora personal con sistema operativo GNU/Linux (Cualquier distribución que incluya gnome y bash, preferiblemente CentOS o Ubuntu). Introducción teórica El lenguaje de bash posee varias características avanzadas más allá de la simple ejecución de comandos. Entre ellas tenemos: Redirección de entradas y salidas. Tuberías Sentencias de control de flujo. A continuación de describirá cada una de ellas. Redirección de entradas y salidas. Normalmente, los comandos de bash emiten su salida a la consola, es decir, a la pantalla de la PC. Es posible hacer que un comando emita su salida a un archivo cualquiera utilizando los símbolos > o >> al final de un comando, seguido del nombre de archivo a donde se quiere guardar la información que se genera. la sintaxis es la
2 siguiente: $ Comando argumentos > Archivo $ Comando argumentos >> Archivo Esto permite, por ejemplo, guardar la salida de un comando ls -l a un archivo, para guardar la lista de archivos generada en un archivo en vez de mostrarla en pantalla. La diferencia que existe entre > y >> es que el primero crea siempre un archivo nuevo y lo borra en caso de existir, mientras que el segundo, abre el archivo y le anexa la información generada por el comando a la que ya contenía antes de abrirlo. Tuberías. La tubería es una forma diferente en que se puede modificar las entradas y salidas, permitiendo que la salida de un comando se utilizada como la entrada de otro comando. Esto se puede lograr mediante el símbolo de barra vertical, escribiendo los comandos juntos, de tal manera que el primer comando emite su salida al siguiente comando (en vez de a la pantalla) sin utilizar archivos intermediarios. La sintaxis es la siguiente: $ Comando1 Comando2 El comando more es un ejemplo de ello, ya que permite ver la salida de comandos que emiten información extensa, pantalla por pantalla, a través de uso de tuberías. Sentencias de control de flujo. Estas permiten que el código se ejecute de manera arbitraria, siendo extremadamente útiles en la creación de guiones inteligentes. Las sentencias de control de flujo incluyen: Ejecución condicional: if, else, elif, fi. Ejecución de casos múltiples: case, esac. Ejecución de bucles: do, done, for, in, until, while. La sintaxis de cada una de estas sentencias se verá a lo largo de la guía.
3 Procedimiento Parte I Redirección de entradas y salidas. 1. Arranque su computadora utilizando el sistema operativo Linux. Ejecute una ventana de consola ya sea desde el menú del sistema Aplicaciones->Accesorios->Terminal, o bien presionando Alt + F2 y digitando gnome-terminal. 2. Cámbiese al directorio de escritorio con cd Desktop, luego cree ahí un directorio con mkdir y nómbrelo como estime conveniente usando algún nombre como practica6 o guia6. Luego cámbiese a ese directorio con cd nombre_del_directorio. 3. Utilice el comando echo para mostrar texto en pantalla: $ echo Este es un mensaje Note como el texto aparece en pantalla justo debajo del comando. 4. Redirija la salida del comando echo a un nuevo archivo de texto con el siguiente comando: $ echo Este es un archivo de texto > Texto1.txt La salida del comando echo, en vez de aparecer en pantalla como normalmente lo hace, lo hizo ahora a través del archivo Texto1.txt, creándolo en el proceso. Confirme que el archivo existe mediante la interfase gráfica o bien mediante el comando ls. Verifique su contenido haciéndole doble click para abrirlo con gedit o bien usando el comando cat Texto1.txt. 5. Anexe nueva información al archivo de texto recién creado, usando el siguiente comando: $ echo Este contenido es nuevo >> Texto1.txt Esta vez, como se usó el símbolo >>, la información será anexada a la que ya existía en el archivo. Compruebe el contenido del archivo mediante gedit o bien con cat Texto1.txt. 6. Proceda ahora a guardar el listado de archivos que contiene el directorio /etc, mediante el siguiente comando: $ ls -l /etc > Texto2.txt
4 Note como es posible utilizar redirección de I/O con prácticamente cualquier comando que emita su salida a la consola. En este caso, el contenido del directorio /etc (un directorio del sistema) se guarda en Texto2.txt en vez de aparecer en pantalla. Verifique su existencia usando la interfase gráfica o bien el comando ls y verifique su contenido con programa el programa gedit, ya sea haciendo doble click en el archivo o bien con el comando gedit Texto2.txt. 7. Ahora se verá cómo comprimir archivos mediante el comando gzip. Utilice gzip sobre el archivo Texto2.txt así: $ gzip -c Texto2.txt Como se puede apreciar, la salida del comando (el archivo comprimido en sí, en formato binario) apareció directamente en pantalla. Esto no es muy útil, ya que la información en pantalla no quedó almacenada. 8. Para solventar la situación, redirija la salida del mismo comando a un archivo en esta ocasión: $ gzip -c Texto2.txt > comprimido.gz Confirme la existencia del archivo ahora mediante el comando ls. 9. Para descomprimir el archivo, utilice el comando gunzip aprovechando de una vez la redirección hacia un archivo, de la siguiente manera: gunzip -c comprimido.gz > descomprimido.txt Confirme que el contenido sea el mismo (el mismo listado de archivos del directorio /etc) usando la interfase gráfica y el programa gedit o bien gedit descomprimido.txt. Nota: El programa gzip es incapaz de manejar varios archivos simultáneamente, por lo que sólo es posible comprimir un archivo a la vez. Más adelante se verá como combinar gzip con tar (un utilitario para pegar varios archivos en uno solo) para obtener la funcionalidad completa de compresión de múltiples archivos. Parte II - Tuberías. 10. Proceda a visualizar en consola el contenido del archivo Texto2.txt creado en la primera parte usando el comando cat:
5 $ cat Texto2.txt Note como la salida del comando es muy extensa, ya que el archivo es grande y su contenido llena varias pantallas. La única manera de ver todo el contenido es utilizando las barras de desplazamiento de la ventana de consola. 11. En esta ocasión, despliegue el contenido del mismo comando usando tuberías y el comando auxiliar more: $ cat Texto2.txt more Ahora el contenido del archivo se muestra pantalla por pantalla al presionar la barra espaciadora. Esto es gracias a que la salida del comando cat es procesada por el comando more antes de enviarse a la pantalla. 12. Cree un tercer archivo de texto de la siguiente manera: $ echo Este es el tercer archivo > Texto3.txt 13. Ahora se utilizará el programa tar para pegar el primer y tercer archivos de textos creados, con el siguiente comando: $ tar -c Texto1.txt Texto3.txt Véase como el utilitario tar también emite su salida a la consola, por lo que la manera correcta de generar el archivo debería ser utilizando redirección: $ tar -c Texto1.txt Texto3.txt > paquete.tar Verifique posteriormente la existencia del archivo con ls. 14. Comprima el archivo.tar del paso anterior con gzip: $ gzip -c paquete.tar > paquete.tar.gz Como puede verse, de esta manera se pueden obtener los famosos archivos.tar.gz que son ampliamente utilizados en muchas de las distribuciones de Linux. Confirme la existencia del nuevo archivo con ls. El siguiente paso consistirá en realizar el mismo proceso pero en un solo comando, combinando todos los conceptos vistos anteriormente.
6 15. Cree un nuevo paquete.tar.gz mediante tuberías y redirección de entradas y salidas: $ tar -c Texto1.txt Texto2.txt Texto3.txt gzip > paquete2.tar.gz El proceso realizado en este comando consiste primeramente de la creación de un archivo.tar a partir de los 3 documentos de texto, luego, la salida de ese comando es enviada mediante tuberías a el comando gzip, el cual al ser invocado sin argumentos, toma automáticamente la salida de la tubería y la comprime. Finalmente, la salida del comando gzip (el archivo comprimido) es redirigida hacia un archivo en el disco duro para ser almacenado. Proceda a verificar que el nuevo archivo comprimido existe mediante ls. 16. Elimine los 3 archivos de texto originales de la siguiente manera: $ rm Texto1.txt Texto2.txt Texto3.txt Confirme ahora que los archivos no existen mediante ls. 17. Con los originales eliminados, proceda a restaurarlos desde el segundo archivo comprimido utilizando tuberías: $ gunzip -c paquete2.tar.gz tar -x El proceso de extracción es exactamente el inverso al de compresión, ya que primeramente se descomprime el archivo mediante gunzip, lo que nos genera un archivo.tar con los 3 archivos de texto pegados entre sí; a continuación el contenido del.tar es pasado mediante tuberías (sin que un archivo intermediario de extensión.tar realmente exista) al comando tar, el cual despega los archivos y los guarda separadamente en el disco duro. El parámetro -x indica a tar que se desea extraer información, pero nótese que no se usa redirección para mandar la información a un archivo, ya que no es posible crear múltiples archivos con éste método y también porque el comando tar automáticamente los genera separadamente en el disco duro. Parte III - Sentencias de control de flujo. 18. Proceda a crear un nuevo guión de bash mediante el programa gedit:
7 $ gedit guion1.sh Luego introduzca el siguiente contenido: #!/bin/bash #Verifica si el archivo Texto4.txt existe, y emite un mensaje #acordemente. El comando [ -a nombre_de_archivo ] permite #verificar si un archivo existe. if [ -a Texto4.txt ] then echo "El archivo Texto4.txt existe" else echo "El archivo Texto4.txt no existe" fi #Verifica si los archivos "Texto4.txt" y "Texto5.txt" existen, #emitiendo mensajes diferentes según exista uno u otro. El #operador && se trata de una operación AND que permite probar si #dos condiciones se cumplen a la vez. if [ -a Texto4.txt ] && [ -a Texto5.txt ] then echo "Ambos archivos existen" elif [ -a Texto4.txt ] then echo "Solo Texto4.txt existe" elif [ -a Texto5.txt ] then echo "Solo Texto5.txt existe" else echo "Ningun archivo existe" fi 19. Agregue el permiso de ejecución al guión y luego proceda a ejecutarlo: $ chmod +x guion1.sh $./guion1.sh Note como el guión indica que no existe ningún archivo al ejecutarlo.
8 20. Proceda a probar el guión creado los archivos Texto4.txt y Texto5.txt de manera alternada para comprobar su funcionamiento. Recuerde ejecutar el guión con./guion1.sh para cada prueba. 21. De manera similar los pasos 18 y 19, cree y ejecute el siguiente archivo de guión. Nombre el archivo como guion2.sh (no olvide agregar el permiso de ejecución). #!/bin/bash #Se imprime un menu simple mediante el comando echo echo "Menu:" echo "1- Ver usuario actual" echo "2- Ver fecha actual" echo "3- Ver directorio actual" echo "Seleccione una opción:" #Se lee el texto que digite el usuario y se guarda en la variable #"Opcion" read Opcion #Se procede ahora a ejecutar comandos de acuerdo a la eleccion #del usuario case $Opcion in 1) #Cada caso lleva el numero o palabra seguido de un parentesis #Para la opcion 1 se muestra una variable de entorno que ya de #por si contiene el nombre del usuario echo "El usuario actual es: $USER" #Notese que es posible incluir variables anteponiendo el #simbolo de dolar a las mismas ;; #Cada caso debe terminarse con 2 caracteres de punto y coma 2) echo "La fecha actual es:" date #El comando date sirve para mostrar la fecha ;; 3) pwd #En la opcion 3 se usa el comando pwd para mostrar el #directorio actual ;;
9 *) #Todos los demas casos se indican con el simbolo asterisco echo "La opcion $Opcion no es valida" ;; esac #La sentencia "case" debe terminarse con "esac" ("case" al #reves) 22. Verifique el guión ejecutándolo en varias ocasiones, y seleccionando opciones diferentes. Pruebe también introduciendo opciones no válidas. 23. Cree un guión con el nombre guion3.sh con el siguiente contenido: #!/bin/bash echo "Imprimiendo los numeros del 1 al 10:" i="1" #inicializa la variable i a 1 while [ $i -le 10 ] #La operación [ X -lt Y ] comprueba si la expresion X es menor que #la expresión Y. do echo "$i" #Imprime el valor de la variable i i=$[ $i + 1 ] #Le suma 1 a i done Recuerde agregar el permiso de ejecución antes de ejecutarlo. Verifique que se imprima una serie de números en la pantalla. 24. Presente todos sus resultados y archivos generados a su docente para que le sean evaluados. 25. Cierre la consola de bash con el comando exit. Apague el equipo y deje en orden su puesto de trabajo.
10 Análisis de resultados El método de descompresión visto en la segunda parte usa tuberías para extraer los archivos sin archivos intermediarios (.tar). Cual sería la secuencia de comandos para hacerlo mediante tal archivo? De qué manera sería posible generar la secuencia de números en orden inverso en el tercer guión?
11 Hoja de cotejo: 6 Guía 6: USO DE BASH EN LINUX PARTE II. Alumno: Puesto No: Docente: GL: Fecha: EVALUACION % 1-4 5-7 8-10 Nota CONOCIMIENTO 25 Explica el proceso de utilización de redirección de entradas y salidas deficientemente. APLICACIÓN DEL CONOCIMIENTO 20 No realizó correctamente la parte de redirección de entradas y salidas. 20 No realizó correctamente la parte de tuberías. 30 Realizó correctamente al menos uno de los guiones automatizados. ACTITUD 2.5 Es un observador pasivo. TOTAL 100 2.5 Es ordenado pero no hace un uso adecuado de los recursos. Explica bien los procesos de redirección, pero desconoce el proceso de utilización de tuberías. Realizó la parte de redirección, pero falló en uno o varios punto. Realizó la parte de tuberías, pero se cometió un fallo en uno o varios puntos. Realizó correctamente al menos 2 de los guiones. Participa ocasionalmente o lo hace constantemente pero sin coordinarse con su compañero. Hace un uso adecuado de lo recursos, respeta las pautas de seguridad, pero es desordenado. Explica claramente todos los conceptos. Realizó correctamente todos los puntos asociados a la redirección de entradas y salidas. Realizó correctamente toda la parte de tuberías. Realizó correctamente los 3 guiones. Participa propositiva e integralmente en toda la práctica. Hace un manejo responsable y adecuado de los recursos conforme a pautas de seguridad e higiene.