250 likes | 444 Views
Linux RHC030. Modulo Standard I/O y tuberias (Pipes). Relator : Carlos Villanueva. Unidad 7 – Sistemas de Archivos Linux. Entrada estándar y salida estándar Error estándar Tuberías. Entrada estándar y salida estándar. Conceptos Claves
E N D
Linux RHC030 Modulo Standard I/O y tuberias (Pipes) Relator : Carlos Villanueva
Unidad 7 – Sistemas de Archivos Linux • Entrada estándar y salida estándar • Error estándar • Tuberías
Entrada estándar y salida estándar • Conceptos Claves • Los programas basados en la terminal tienden a leer información desde una fuente y a escribir la información en un destino. • La fuente desde donde se leen los programas se conoce como una entrada estándar (stdin, del inglés standard in) y suele estar conectada al teclado de la terminal. • El destino al que los programas escriben se conoce como una salida estándar (stdout, del inglés standard out) y suele estar conectada a la pantalla de la terminal. • Cuando se utiliza la shell bash, la stdout puede redirigirse mediante > o >> y la stdin puede redirigirse mediante <.
Tipos de Programas • Programas gráficos • Los programas gráficos están diseñados para ejecutarse en el entorno gráfico X. • Expect the user to be using a mouse, popup menus and buttons, for user input • Esperan que el usuario utilize el mouse y los componentes gráficos comunes tales como menús emergentes y botones para la entrada de datos • Ejemplo – Mozilla Web Browser • Programas de pantalla • Los programas de pantalla esperan utilizar una consola de texto. • Apropiados para terminales y consolas virtuales • Ejemplo – vi y nano • Programas de terminal • Reunen entradas y salidas de pantalla en un flujo • suelen llamarse simplemente comandos. • Ejemplo – ls y cat
Entrada estándar (stdin) y salida estándar (stdout) • Los programas de terminal suelen leer información como un flujo desde una sola fuente tal como el teclado de una terminal (stdin) • Generalmente, escriben información como un flujo a un solo destino como por ejemplo una pantalla (stdout) • Generalmente, stdin y stdout están conectadas a la terminal que ejecuta el comando. • Se considera conveniente redirigir (stdin) desde (stdout) hacia los archivos.
Escritura de una salida a un archivo • La shell bash usa > para redirigir un flujo de stdout de proceso a un archivo. [elvis@station elvis]$ ps aux > sluggish.txt [elvis@station elvis]$ [elvis@station elvis]$ head sluggish.txt USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 1380 76 ? S Jun02 0:04 init [ root 2 0.0 0.0 0 0 ? SW Jun02 0:00 [keventd] root 3 0.0 0.0 0 0 ? SW Jun02 0:00 [kapmd]
Agregando una salida a un archivo • Para agregar una salida de un comando a un archivo, en lugar de sobrescribirlo, bash usa >>. [elvis@station elvis]$ date > sluggish.txt [elvis@station elvis]$ ps aux >> sluggish.txt [elvis@station elvis]$ head sluggish.txt Tue Jun 3 16:57:23 EDT 2003 USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 1380 76 ? S Jun02 0:04 init [ root 2 0.0 0.0 0 0 ? SW Jun02 0:00 [keventd] root 3 0.0 0.0 0 0 ? SW Jun02 0:00 [kapmd]
Redirección de stdin • bash usa < para hacer que lean entradas desde alguna parte diferente al teclado. [elvis]$ mail -s "Computer is sluggish" root@localhost@localdomain Hey root... I'm sending a list of processes that were running in a separate email. Thanks! --elvis . Cc: [elvis]$ mail -s "ps output" root@localhost@localdomain< sluggish.txt
Archivos abiertos y descriptores de archivos • Con el fin de leer o escribir información en un archivo un proceso debe abrir el archivo. • Los procesos de Linux (y Unix) mantienen el registro de los archivos que están abiertos mediante la asignación de un número entero a cada uno. • El número entero se conoce como un descriptor de archivos.
Archivos abiertos y descriptores de archivos • Cada proceso tiene un subdirectorio asociado bajo /proc llamado como su PID (ID del proceso). • El subdirectorio del proceso a su vez tiene un subdirectorio llamado fd (del inglés file descriptor). • Dentro del subdirectorio /proc/pid/fd, existe un enlace simbólico para cada archivo abierto por el proceso. • El nombre del enlace simbólico es el número entero del descriptor de archivo abierto y el enlace simbólico apunta al archivo mismo.
Ejemplos stdin / stdout [elvis@station elvis]$ cat /etc/termcap [1]+ Stopped cat /etc/termcap [elvis@station elvis]$ [elvis@station elvis]$ ps PID TTY TIME CMD 1368 pts/1 00:00:00 bash 1910 pts/1 00:00:00 cat 1911 pts/1 00:00:00 ps [elvis@station elvis]$ ls -l /proc/1910/fd total 0 lrwx------ 1 elvis elvis 64 Sep 13 06:42 0 -> /dev/tty1 lrwx------ 1 elvis elvis 64 Sep 13 06:42 1 -> /dev/tty1 lrwx------ 1 elvis elvis 64 Sep 13 06:42 2 -> /dev/tty1 lr-x------ 1 elvis elvis 64 Sep 13 06:42 3 -> /etc/termcap
Como protocolo de Linux (y Unix), cada proceso hereda tres archivos abiertos tras el inicio. Primero, descriptor de archivo 0, es la entrada estándar. Segundo, descriptor de archivo 1, es la salida estándar. Tercero, descriptor de archivo 2, es el error estándar. Descriptores de Archivos
Redireccionamiento [elvis@station elvis]$ cat /etc/termcap > /tmp/foo [1]+ Stopped cat /etc/termcap >/tmp/foo [elvis@station elvis]$ [elvis@station elvis]$ ps PID TTY TIME CMD 1368 pts/1 00:00:00 bash 1910 pts/1 00:00:00 cat 1911 pts/1 00:00:00 ps [elvis@station elvis]$ ls -l /proc/1910/fd total 0 lrwx------ 1 elvis elvis 64 Sep 13 06:42 0 -> /dev/tty1 lrwx------ 1 elvis elvis 64 Sep 13 06:42 1 -> /tmp/foo lrwx------ 1 elvis elvis 64 Sep 13 06:42 2 -> /dev/tty1 lr-x------ 1 elvis elvis 64 Sep 13 06:42 3 -> /etc/termcap
Conceptos Claves Los programas Unix reportan condiciones de error a un destino llamado error estándar (stderr). Usualmente, stderr está conectado a una pantalla de terminal y los mensajes de error se encuentran entremezclados con las salidas estándar. Cuando se utiliza la shell bash, el flujo de stderr puede redirigirse a un archivo mediante 2>. Al utilizar bash, el flujo de stderr puede combinarse con el flujo de stdout mediante 2>&1 o >& Error estándar
Error estándar (stderr) • En la siguiente secuencia, elvis está utilizando el comando head -1 para generar una lista de las primeras líneas de todos los archivos en el directorio /etc/rc.d. • [elvis@station elvis]$ head -1 /etc/rc.d/* • ==> /etc/rc.d/init.d <== • head: /etc/rc.d/init.d: Is a directory • ==> /etc/rc.d/rc <== • #! /bin/bash • ==> /etc/rc.d/rc0.d <== • head: /etc/rc.d/rc0.d: Is a directory • ==> /etc/rc.d/rc1.d <== • head: /etc/rc.d/rc1.d: Is a directory • ==> /etc/rc.d/rc2.d <== • head: /etc/rc.d/rc2.d: Is a directory • ==> /etc/rc.d/rc3.d <== • head: /etc/rc.d/rc3.d: Is a directory • ==> /etc/rc.d/rc4.d <== • head: /etc/rc.d/rc4.d: Is a directory • ==> /etc/rc.d/rc5.d <== • head: /etc/rc.d/rc5.d: Is a directory • ==> /etc/rc.d/rc6.d <== • head: /etc/rc.d/rc6.d: Is a directory • ==> /etc/rc.d/rc.local <== • #!/bin/sh • ==> /etc/rc.d/rc.sysinit <== • #!/bin/bash • ==> /etc/rc.d/rc.sysinit.rpmsave <== • #!/bin/bash
Ejemplo de Error estándar (stderr) • [elvis@station elvis]$ head -1 /etc/rc.d/* > rcsummary.out • head: /etc/rc.d/init.d: Is a directory • head: /etc/rc.d/rc0.d: Is a directory • head: /etc/rc.d/rc1.d: Is a directory • head: /etc/rc.d/rc2.d: Is a directory • head: /etc/rc.d/rc3.d: Is a directory • head: /etc/rc.d/rc4.d: Is a directory • head: /etc/rc.d/rc5.d: Is a directory • head: /etc/rc.d/rc6.d: Is a directory
Error estándar (stderr) • Segundo flujo de salida • usado para reportar condiciones de error • Aunque no es obvio desde el principio, los comando realmente estan enviando salida a dos flujos independientes. • (stdout) • (stderr) [elvis]$ head -1 /etc/rc.d/* > rcsummary.out 2> rcsummary.err [elvis]$
Combinación de stdout y stderr • Usando 2>&1 para combinar stdout y stderr se introdujo en la shell Unix original, la shell Bourne (sh). Dado que bash está diseñado para ser compatible con sintaxis anteriores sh también soporta esta sintaxis. Sin embargo, la sintaxis no es conveniente. • Para simplificar las cosas, bash usa >& para combinar stdin y stdout como en el siguiente ejemplo. [elvis@station elvis]$ head -1 /etc/rc.d/* >& rcsummary.both
Conceptos Claves El flujo de stdout desde un proceso puede estar conectado al flujo de stdin de otro proceso mediante lo que Unix llama una "tubería". Varios de los comandos en Unix están diseñados para operar como un filtro, leer la entrada desde stdin y enviar la salida a stdout. bash usa "|" para crear una tubería entre dos comandos. Tuberías
Tubería (Pipes) • Pipe o tubería es una de las formas más comunes y eficaces para redirigir una combinación de la salida (salida estándar) de un comando la cual es "entubada" directamente dentro de la entrada (entrada estándar) de otro comando. • Con el fin de crear una tubería por medio de bash, los dos comandos se unen con una barra vertical |
Ejemplo Tuberia (Pipe) • Usando el comando find para listar los archivos alfabeticamente [prince]$ find /etc -size +100k 2>/dev/null | sort /etc/aep/aeptarg.bin /etc/lynx.cfg.ja /etc/makedev.d/cciss /etc/squid/squid.conf /etc/squid/squid.conf.default /etc/termcap [prince]$
Filtro de salida con grep • El comando grep se utiliza para buscar y extraer líneas que contengan una cadena de texto específico. • Ejemplo: Se trata de hallar un directorio llamado templates que se creó hace unos meses. Utiliza el comando locate para encontrarlo. • [prince@station prince]$ locate templates • /etc/openldap/ldaptemplates.conf • /usr/share/doc/libxslt-1.0.27/html/libxslt-templates.html • /usr/share/doc/libxslt-1.0.27/templates.gif • /usr/share/doc/docbook-style-xsl-1.58.1/docsrc/templates.xml • /usr/share/man/man5/ldaptemplates.conf.5.gz • /usr/share/man/man3/ldap_free_templates.3.gz • /usr/share/man/man3/ldap_init_templates_buf.3.gz • /usr/share/man/man3/ldap_init_templates.3.gz • ... [prince]$ locate templates | grep prince /home/prince/.kde/share/apps/quanta/templates /home/prince/proj/templates [prince]$ Con el fin de reducir la información a archivos más importantes, prince toma la stdout desde el comando locate y crea una tubería para la stdin del comando grep, "buscando" la palabra "prince".