Universidad de Costa Rica Facultad de Ingeniería Escuela de Ingeniería Eléctrica IE0117 – Programación bajo plataformas abiertas I ciclo 2012 Profesor Francisco Siles Canales Asistente Félix Suárez Bonilla Laboratorio 100 Muy bien ! Laboratorio 2 Estudiante Enrique Sáurez Apuy, A95872 19 de marzo, 2012 Primera Parte: Uso del shell en GNU/Linux 2. ¿Qué sucede en cada caso? ¿Cuándo no funciona el comando echo y por qué? En el Cuadro 1 se muestran todos los comandos que se ejecutaron en la terminal y cada uno de los casos. En el primer caso se utiliza el comando echo $SALUDO, pero no se obtiene respuesta (respuesta vacía), esto se debe a que para este punto no se ha definido la variable de entorno SALUDO, por lo que al buscarla, no existe, y no se da la respuesta que se está buscando que es hola. Para el segundo caso, ya se definió la variable SALUDO, por lo que cuando se ejecuta el echo $SALUDO, la terminal responde con hola, esto se debe a que no se ha cambiado de bash, y ya se definió la variable. El tercer caso, se encuentra en un bash nuevo, y dado que cuando se definió SALUDO fue en un bash distinto, cuando se utiliza el comando echo, no se obtiene respuesta. En el cuarto caso, a pesar de estar en un nuevo bash, la variable SALUDO fue exportada con anterioridad, por lo que sí se puede acceder en cualquier bash nuevo dentro de la misma terminal. Por lo que al llamarla, esta si responde con hola. quique@ubuntu:~$ echo $SALUDO //Primer Caso quique@ubuntu:~$ SALUDO=hola quique@ubuntu:~$ echo $SALUDO //Segundo caso hola quique@ubuntu:~$ bash quique@ubuntu:~$ echo $SALUDO //Tercer Caso quique@ubuntu:~$ exit exit quique@ubuntu:~$ export SALUDO=hola quique@ubuntu:~$ bash equique@ubuntu:~$ echo $SALUDO //Cuarto caso hola quique@ubuntu:~$ exit exit Cuadro 1: Código echo y creación de variables de entorno 3. ¿Qué sucede con las variables declaradas si cierra la sesión y la inicia de nuevo? En el Cuadro 2 se muestra la creación de las variables, y su verificación. No se utiliza printenv para mostrar las variables, porque existen bastantes variables más, que complican su verificación en el presente documento. Pero, en su momento si fueron mostradas por printenv. Si se cierra la terminal y se vuelve a abrir, se pierden las variables definidas en la anterior terminal. quique@ubuntu:~$ export GRUPO=1 //Primer terminal quique@ubuntu:~$ export SIGLAS=ie0117 quique@ubuntu:~$ export ESTUDIANTE=enrique quique@ubuntu:~$ echo $SIGLAS $GRUPO $ESTUDIANTE ie0117 1 enrique quique@ubuntu:~$ echo $SIGLAS $GRUPO $ESTUDIANTE//Terminal nueva Cuadro 2: Variables de entorno, 4. Declare algunas variables usando export, pero esta vez editando el archivo ~/.bashrc (archivo de configuración de bash para el usuario). Cierre la sesión e ingrese de nuevo. ¿Qué sucede ahora con las variables? En el Cuadro 3 se muestra las líneas que se le agregaron al archivo .bashrc, luego en un terminal nueva se llaman a las variables SIGLA y GRUPO, y se obtiene la respuesta correcta. Por lo que ahora la variable de entorno ahora es global para cualquier terminal que se abra. export GRUPO=1 export SIGLA=ie117 Cuadro 3: Valores agregados al .bashrc quique@ubuntu:~$ echo $SIGLA ie117 quique@ubuntu:~$ echo $GRUPO 1 Cuadro 4: Invocación a las variables luego de haberlas agregado al .bashrc 5. ¿Qué sucede en cada caso? ¿Qué función cumple la redirección o tubería? En el Cuadro 5 se muestra el comando utilizado para almacenar la fecha en un documento denominado “fecha.txt”, el resultado se muestra en Cuadro 6. Si el archivo ya existía este lo sobrescribe. Luego se utiliza el comando del Cuadro 7, que lo que hace es escribir de nuevo la fecha pero agregándolo al final del documento “fecha.txt”, esto se observa en el Cuadro 8. quique@ubuntu:~/Desktop$ date > fecha.txt Cuadro 5: Comando Mon Mar 19 08:15:34 CST 2012 Cuadro 6: Contenido de fecha.txt quique@ubuntu:~/Desktop$ date >> fecha.txt Cuadro 7: Comando Mon Mar 19 08:15:34 CST 2012 Mon Mar 19 08:17:48 CST 2012 Cuadro 8: Nuevo contenido de fecha.txt En el comando del Cuadro 9, se guardan el nombre y otros datos de los archivos (en formato largo) contenidos en /etc/, donde el inicio del archivo se muestra en el Cuadro 10. Luego si se utiliza el comando en el Cuadro 11, se reescribe el archivo dir.txt con los nombres de los archivos en /bin, y se crea el archivo en el Cuadro 12, donde resulta evidente que se modifico el archivo, es decir, se reescribió el mismo. quique@ubuntu:~/Desktop$ ls -l /etc/ > dir.txt Cuadro 9: Comando total 1284 drwxr-xr-x 3 root root 4096 2012-02-27 09:03 acpi -rw-r--r-- 1 root root 2981 2011-10-12 08:27 adduser.conf -rw-r--r-- 1 root root 46 2012-02-27 16:21 adjtime drwxr-xr-x 2 root root 4096 2012-03-18 14:20 akonadi drwxr-xr-x 2 root root 4096 2012-03-13 21:29 alternatives -rw-r--r-- 1 root root 395 2010-06-20 02:11 anacrontab -rw-r--r-- 1 root root 112 2007-06-22 09:08 apg.conf drwxr-xr-x 6 root root 4096 2011-10-12 08:28 apm drwxr-xr-x 3 root root 4096 2011-10-12 08:29 apparmor … Cuadro 10: Parte del contenido del archivo dir., txt quique@ubuntu:~/Desktop$ ls -l /bin/ > dir.txt Cuadro 11: Comando total 9056 -rwxr-xr-x 1 root root 950896 2011-05-18 04:00 bash -rwxr-xr-x 1 root root 31112 2011-12-13 10:30 bunzip2 -rwxr-xr-x 1 root root 1719048 2011-09-01 11:02 busybox -rwxr-xr-x 1 root root 31112 2011-12-13 10:30 bzcat lrwxrwxrwx 1 root root 6 2011-12-13 10:30 bzcmp -> bzdiff -rwxr-xr-x 1 root root 2140 2011-12-13 10:30 bzdiff lrwxrwxrwx 1 root root 6 2011-12-13 10:30 bzegrep -> bzgrep -rwxr-xr-x 1 root root 4877 2011-12-13 10:30 bzexe … Cuadro 12: Parte del contenido del archivo dir.txt Luego se utilizó el comando que se observa en el Cuadro 13, el cual genera el archivo hola.txt con el contenido “Hola Mundo!” como se muestra en el Cuadro 14. quique@ubuntu:~/Desktop$ echo Hola Mundo! >hola.txt Cuadro 13: Comando Hola Mundo! Cuadro 14: Contenido del archivo hola.txt En el Cuadro 15 se observa el comando que se utilizó, lo que hace esta línea es tomar el archivo passwd (como entrada estándar) y lo comprime al archivo passwd.gz (salida estándar). quique@ubuntu:~/Desktop$ gzip < /etc/passwd > passwd.gz Cuadro 15: Comando Luego se ejecuto el comando del Cuadro 16, que lo que hace es descomprimir y mostrar como salida estándar al archivo “passwd.gz” y luego se realiza un pipe para conectar esta salida al comando less para que lo muestre en la pantalla de la terminal como se muestra en el Cuadro 17. gzip -dc passwd.gz |less Cuadro 16: Comando root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/bin/sh man:x:6:12:man:/var/cache/man:/bin/sh lp:x:7:7:lp:/var/spool/lpd:/bin/sh mail:x:8:8:mail:/var/mail:/bin/sh news:x:9:9:news:/var/spool/news:/bin/sh uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh Cuadro 17: Parte del contenido de la terminal. Al editar el comando del Cuadro 18, lo que se hace es buscar un paquete que contenga en su descripción las palabras “text editor” y luego el resultado de este comando es mostrado en la terminal utilizando el comando less, tal y como se muestra en el Cuadro 19. apt-cache search text editor | less Cuadro 18: Comando ed - The classic UNIX line editor emacs - The GNU Emacs editor (metapackage) emacs23 - The GNU Emacs editor (with GTK+ user interface) emacs23-bin-common - The GNU Emacs editor's shared, architecture dependent files emacs23-common - The GNU Emacs editor's shared, architecture independent infrastructure emacs23-el - GNU Emacs LISP (.el) files emacs23-nox - The GNU Emacs editor (without X support) libqscintilla2-5 - The Qt4 port of the Scintilla source code editing widget libqscintilla2-designer - Qt4 Designer plugin for QScintilla 2 libqscintilla2-dev - The Scintilla source code editing widget for Qt4, development files libqscintilla2-doc - API documentation for QScintilla 2 linuxdoc-tools - convert LinuxDoc SGML source into other formats nano - small, friendly text editor inspired by Pico python-qscintilla2 - Python bindings for QScintilla 2 scribus - Open Source Desktop Page Layout - stable branch texlive-latex-extra - TeX Live: LaTeX supplementary packages tmispell-voikko - Ispell wrapper which uses Voikko for spell-checking x11-apps - X applications axe - An editor for X : Cuadro 19: resultado de la búsqueda de “text editor” Luego se ejecuta el comando que se muestra en el Cuadro 20, el cual lo que hace es leer el archivo /etc/passwd, y luego se envía estos datos a un grep buscando la palabra root, la cual luego despliega el resultado en la siguiente línea, mostrando en que línea del documento contiene la palabra root. quique@ubuntu:~/Desktop$ cat /etc/passwd | grep root root:x:0:0:root:/root:/bin/bash Cuadro 20: Comando y resultado A continuación se utiliza el comando mostrado en el Cuadro 21, que lo que hace es enviar la lectura del documento copyright al comando wc que lo que hace es leer la cantidad de líneas nuevas, palabras y bytes, en ese orden, y los muestra en la terminal. quique@ubuntu:~/Desktop$ cat /usr/share/doc/gcc/copyright | wc 42 330 2207 Cuadro 21: Comando y resultado En el Cuadro 22 se muestra la ejecución del último comando, que lo que hace es mostrar todos los documentos en /etc/ a través del comando tee, que además de mostrarlo en la terminal, lo guarda en el documento ls.txt quique@ubuntu:~/Desktop$ ls -l /etc/ | tee ls.txt total 1284 drwxr-xr-x 3 root root 4096 2012-02-27 09:03 acpi -rw-r--r-- 1 root root 2981 2011-10-12 08:27 adduser.conf -rw-r--r-- 1 root root 46 2012-02-27 16:21 adjtime drwxr-xr-x 2 root root 4096 2012-03-18 14:20 akonadi drwxr-xr-x 2 root root 4096 2012-03-13 21:29 alternatives -rw-r--r-- 1 root root 395 2010-06-20 02:11 anacrontab -rw-r--r-- 1 root root 112 2007-06-22 09:08 apg.conf drwxr-xr-x 6 root root 4096 2011-10-12 08:28 apm drwxr-xr-x 3 root root 4096 2011-10-12 08:29 apparmor drwxr-xr-x 8 root root 4096 2012-03-18 14:20 apparmor.d drwxr-xr-x 5 root root 4096 2012-02-27 09:00 apport drwxr-xr-x 6 root root 4096 2012-03-13 21:20 apt -rw-r----- 1 root daemon 144 2011-05-16 04:32 at.deny drwxr-xr-x 2 root root 4096 2012-02-27 08:59 at-spi2 Cuadro 22: comando y resultado Segunda Parte: Programación de tareas con cron En el Cuadro 23, se muestra como se completo el ejercicio requerido, que era escribir en el archivo /tmp/date para que se escriba cada minuto la fecha en el archivo /tmp/date * * * * * date >> /tmp/date quique@ubuntu:~$ cat /tmp/date Mon Mar 19 09:00:01 CST 2012 Mon Mar 19 09:01:01 CST 2012 Cuadro 23: Edición del crontab, y resultado En el Cuadro 24 se muestra la modificación hecha al archivo /etc/crontab para realizar la acción solicitada, que era escribir “Esto es una prueba” en el archivo /root/prueba dentro de tres minutos, y luego cada jueves a esa misma hora. Dado que la hora actual es la 9:14, dentro de 3 minutos es las 9:17, en el Cuadro 25 se verifica el funcionamiento de la modificación. Dado que antes de las 9:17 no se ha generado el archivo por lo que se busca el archivo y este todavía no existe. Luego de las 9:17 ya existe el archivo, y se escribe en la pantalla “Esto es una prueba”. 17 9 19 3 * root echo "Esto es una prueba" > /root/prueba 17 9 * * 4 root "Esto es una prueba" > /root/prueba Cuadro 24: modificación del archivo /etc/crontab quique@ubuntu:~$ sudo cat /root/prueba cat: /root/prueba: No such file or directory quique@ubuntu:~$ date Mon Mar 19 09:16:47 CST 2012 quique@ubuntu:~$ sudo cat /root/prueba Esto es una prueba quique@ubuntu:~$ date Mon Mar 19 09:17:20 CST 2012 Cuadro 25: salida estándar para verificar que la modificación en /etc/crontab funciona