Tuberias y redireccionamiento

Redireccionamiento de salidas

Puede que le sea familiar algún redireccionamiento, como:

salida_ls
que guarda la salida del comando ls en un archivo denominado salidals.txt

Sin embargo, el redireccionamiento es mucho más de lo que muestra el ejemplo. El descriptor de archivo 0 es la entrada estándar a un programa, el descriptor de archivo 1 es la salida estándar, y el descriptor de archivo 2 es la salida de error estándar. Puede redireccionarlos por separado. de hecho, también puede redireccionar otros descriptores de archivos, pero normalmente se redireccionan los estándar 0, 1 y 2.

La figura anterior redirecciona la salida estándar a un archivo usando el operador <. Por defecto, si el archivo existe ya, será eliminado. Si desea modificar el comportamiento preestablecido, puede usar el comando set -0 noclobbet (o set -C), que establece la opción noclobbet para evitar que se elimine un archivo usando el redireccionamiento. Puede cancelar esta opción usando set +o noclobbet. Verá más opciones para el comando set a lo largo del capítulo.

Para añadir más datos al archivo creado anteriormente (salidals.txt) usaremos el operador >>.

Por ejemplo:

salidals_1
Vemos arriba el listado del archivo listadols.txt creado anteriormente.

Usamos la orden:

ps_salidals
vemos que ha añadido la salida del comando ps al final del archivo especificado (salidals.txt).

Para redireccionar la salida de error estándar, escriba primero el operador > junto con el número del descriptor de archivo que quiera redireccionar. Como el error estándar está en el descriptor de archivo 2, usaremos el operador 2>. Resulta útil para eliminar la información errónea y para evitar que aparezca en pantalla.

Imagine que queremos usar el comando kill para cancelar un proceso de un script. Existe siempre un pequeño riesgo de que el proceso finalice antes de que se ejecute el comando kill. Si ocurre esto, kill escribirá un mensaje de error a la salida  de error estándar y el error, evitará que el comando kill escriba cualquier texto en la pantalla.

El comando:

kill_error
colocará la salida y la información errónea en archivos independientes.

Si prefiere mantener ambos conjuntos de salida en un único archivo, puede usar el operador >& para combinar ambas salidas. Por ejemplo:

kill_error2

introducirá tanto las salidas como las salidas de error en el mismo archivo. Tenga en cuenta el orden de los operadores. Leemos el comando de la siguiente manera: “redireccionar la salida estándar al archivo killsalidaerror.txt, y después dirigir el error estándar al mismo sitio que la salida estándar” . Si no seguimos el orden correcto, el redireccionamiento no funcionará tal como esperamos.

Al ser posible descubrir el resultado del comando kill usando el código de retorno, normalmente no querrá guardar ni la salida estándar ni el error estándar. Puede utilizar el universal de Linuxbit bucket” de /dev/null para eliminar correctamente toda la salida:

kill_null
Redireccionamiento de entradas

Así como se redireccionan salidas, también se pueden redireccionar entradas. Por ejemplo:

more
El comando more de Linux acepte nombres de archivos como parámetros, a diferencia de la línea de comando equivalente en Windows.

Tuberías

Puede conectar procesos usando el operador de tubería (|). En Linux, a diferencia de MS-DOS, los procesos conectados mediante tuberías se pueden ejecutar de manera simultánea y se vuelven a planear automáticamente cuando los datos fluyen a través de ellos. A modo de ejemplo sencillo, podría usar el comando sort para organizar la salida ps.

Ejemplo sin tuberías, tendríamos que realizar varios pasos:

tuberias_ejemplo1

Ejemplo más elegante conectando los procesos mediante una tubería:

tuberia_ejemplo_2
Probablemente querrá ver la paginación de los datos de salida en la pantalla, así que puede conectar un tercer proceso, more, todo en la misma línea de comando:

ejemplo_tuberia_3
No existe prácticamente límite alguno en el número de procesos que se pueden conectar. Imagine que desea ver los procesos que se están ejecutando excepto las shell. Podríamos escribir en la consola:

ejemplo_tuberia_4
De esta manera las salidas de ps se organizaran en orden alfabético, se extraerán los procesos usando uniq, se usará grep -v sh para eliminar el proceso denominado sh, y finalmente aparecerán paginadas en la pantalla.

Como podemos ver, es una solución mucho más elegante que una cadena de comandos independientes, cada uno con su propio archivo temporal. Sin embargo, tengamos en cuenta que si dispone de una cadena de comandos, el archivo de salida se crea o escribe de manera inmediata cuando se genera el conjunto de comandos, de manera que no se pueda usar nunca un nombre de archivo dos veces en una cadena de comandos. Si intenta hacer algo como:

error_tuberia
obtendrá un archivo vacío, ya que eliminará el archivo MisDatos.txt antes de que pueda leerlo.

 Existen dos modos para escribir programas shell.

  1. Escribir la secuencia de comandos y permitir a la shell que los ejecute interactivamente.
  2. Guardar los comandos en un archivo y después invocarlos como si fuesen un programa.

Programas interactivos

Escribir el script de la shell en la línea de comando es un modo rápido y sencillo de comprobar pequeños fragmentos de códigos, y es muy útil cuando se está empezando o sencillamente como modo de comprobación.

Imagine que tiene un gran número de archivos C y que desea examinar los archivos que contiene la cadena POSIX. En vez de realizar la búsqueda usando el comando grep para la cadena de los archivos y después enumerar los archivos por separado, puede realizar toda la operación en un script interactivo:

programa_ejemplo_1
Observe como cambia el incitador shell normal & a un > cuando la shell espera más entradas. Puede dejar de escribir, permitiendo que la shell decida si ya ha acabado, y el script se ejecutará de manera inmediata. La shell también realiza expansión de comodines (que se suele conocer como globbing). Seguramente sea consciente del uso de ‘*‘ a modo de comodín para hacer corresponder a una cadena de caracteres. Pero es posible que no sepa que puede solicitar comodines de un sólo carácter usando ‘?‘, en tanto que [set] permite que se compruebe cualquier número de caracteres únicos. [^set] niega el conjunto, es decir, incluyen cualquier cosa excepto el conjunto especificado. La expansión de corchete usando {} (disponible en algunas shell, incluso en bash) le permite agrupar las cadenas arbitrarias en un conjunto que expandirá la shell. Por ejemplo:

expansiones
enumerará los archivos Mi_perros y Mi_gatos. este comando usa la shell para comprobar todos los archivos del directorio actual.

Podemos utilizar cualquier editor preferido para crear un archivo que contenga los comandos, cree un archivo denominado first que tenga esta apariencia:

script_ejemplo_1
Vemos que los comentarios comienzan con # y continua hasta el final de la línea. Sin embargo vemos que la primera línea #!/bin/sh, es una forma de comentario especial. los carácteres #! le indican al sistema que el argumento que le sigue en la línea es el programa que se ha de usar para ejecutar este archivo. En este caso, /bin/sh es el programa shell predeterminado.

comentario_script
Como el script se entiende básicamente como entrada estándar para la shell, contiene todos los comandos Linux referenciados por su variable de entorno PATH.

El comando exit asegura que el script envía un código de salida perceptible. Cuando los programas se ejecutan interactivamente, no se suele realizar esta comprobación, pero si desea ejecutar este script desde otro script y comprobar si funciona, es muy importante retornar un código de salida apropiado.

Un cero denota éxito en la programación shell. Como el script, tal como está, no puede detectar ningún error, siempre envía éxito. Tenga en cuenta que este script no usa ninguna extensión del nombre de archivo ni ningún sufijo. Linux, y UNIX en general, no suele usar la extensión del nombre de archivo para determinar el tipo de archivo. Podría haber usado .sh o haber añadido otra extensión, porque la shell no se preocupa de ello. La mayoría de script preinstalado no disponen de extensión, y el mejor modo para comprobar si son o no scripts, es usando el comando file, por ejemplo file first /bin/bash. Usaremos la convención que más le convenga.

script_firstatras

 

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s